質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2673閲覧

php MySQL 画像をまとめて送信

shinshin

総合スコア37

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2014/12/03 08:11

質問よろしくお願いします。

現在phpを使いデータベースと連携するandroid,iosのアプリ作成をしているのですが、

画像をまとめてデータベースに保存、読み出しができずにつまづいています。

http://qiita.com/mpyw/items/117ab6a88fd58d911c34
(自分のコードを張り付けるとフリーズして質問途中で終わるので)参考にさせていただいたサイトをそのまま張りますが、
こちらを参考にして画像を1つずつなら送信できたのですが、ここからまとめて画像で送るというのができません。

multipleを使い、for文で回す、という事をすればいいと思うのですができません。

アドバイスや参考になるサイト、できたらソースコード等教えて頂けたらありがたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

input要素のname属性は配列になっていますか?
配列にせず、同じname属性でアップロードするとうまくいかないので、たとえばname="file"としている場合はname="file[]"という風に[]をつけてあげます。

そうするとPHPfileという配列で渡るので以下のようにしてループを回すことができるようになります。

lang

1// 1つずつ処理 2foreach ($_FILES["file"]["error"] as $key => $value) { 3 // ファイル名 4 $file_name = $_FILES["file"]["name"][$key]; 5 // ファイルタイプ(MIME) 6 $file_type = $_FILES["file"]["type"][$key]; 7 // ファイルサイズ(byte) 8 $file_size = $_FILES["file"]["size"][$key]; 9 // 一時的に保存された場所へのパス 10 $file_temp = $_FILES["file"]["tmp_name"][$key]; 11}

どういう処理になっているのか把握しきれないので想像で回答しました。

投稿2014/12/03 12:12

SAMURAI-HACK

総合スコア988

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinshin

2014/12/03 18:10

ご回答ありがとうございます。 name属性は[ ]にしています。 <input type="file" name="upfile[ ]" multiple/><br /> したいイメージが参考にしていたサイト+フォルダで出し入れ。 というイメージなので教えて頂いたforeach文を使えば出来そうなのですが組み込み方がいまいち分からずlocalで起動しても真っ白なページになります。 コード載せれそうなので、関係がありそうな部分の変更した部分載せます。 サイトと違うのはforeach文の部分と <input type="file" name="upfile[]" multiple/><br /> の部分です。 ご教授よろしくお願いいたします。 // データベースに接続 $pdo = new PDO( 'mysql:host=localhost;dbname=imagedb;charset=utf8', 'root', 'root', [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); /* アップロードがあったとき */ if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) { // バッファリングを開始 ob_start(); try { // 1つずつ処理 foreach ($_FILES["file"]["error"] as $key => $value) { // ファイル名 $file_name = $_FILES["file"]["name"][$key]; // ファイルタイプ(MIME) $file_type = $_FILES["file"]["type"][$key]; // ファイルサイズ(byte) $file_size = $_FILES["file"]["size"][$key]; // 一時的に保存された場所へのパス $file_temp = $_FILES["file"]["tmp_name"][$key]; } // サムネイルをバッファに出力 $create = str_replace('/', 'createfrom', $info['mime']); $output = str_replace('/', '', $info['mime']); if ($info[0] >= $info[1]) { $dst_w = 120; $dst_h = ceil(120 * $info[1] / max($info[0], 1)); } else { $dst_w = ceil(120 * $info[0] / max($info[1], 1)); $dst_h = 120; } $dst = imagecreatetruecolor($dst_w, $dst_h); imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]); $output($dst); imagedestroy($src); imagedestroy($dst); // INSERT処理 $stmt = $pdo->prepare('INSERT INTO image(name,type,raw_data,thumb_data,date) VALUES(?,?,?,?,?)'); $stmt->execute([ $_FILES['upfile']['name'], $info[2], file_get_contents($_FILES['upfile']['tmp_name']), ob_get_clean(), // バッファからデータを取得してクリア (new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'), ]); $msgs[] = ['green', 'ファイルは正常にアップロードされました']; } catch (RuntimeException $e) { while (ob_get_level()) { ob_end_clean(); // バッファをクリア } http_response_code($e instanceof PDOException ? 500 : $e->getCode()); $msgs[] = ['red', $e->getMessage()]; } /* ID指定があったとき */ } elseif (isset($_GET['id'])) { try { $stmt = $pdo->prepare('SELECT type, raw_data FROM image WHERE id = ? LIMIT 1'); $stmt->bindValue(1, $_GET['id'], PDO::PARAM_INT); $stmt->execute(); if (!$row = $stmt->fetch()) { throw new RuntimeException('該当する画像は存在しません', 404); } header('X-Content-Type-Options: nosniff'); header('Content-Type: ' . image_type_to_mime_type($row['type'])); echo $row['raw_data']; exit; } catch (RuntimeException $e) { http_response_code($e instanceof PDOException ? 500 : $e->getCode()); $msgs[] = ['red', $e->getMessage()]; } } // サムネイル一覧取得 $rows = $pdo->query('SELECT id,name,type,thumb_data,date FROM image ORDER BY date DESC')->fetchAll(); } catch (PDOException $e) { http_response_code(500); $msgs[] = ['red', $e->getMessage()]; } ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>画像アップロード</title> <style><![CDATA[ fieldset { margin: 10px; } legend { font-size: 12pt; } img { border: none; float: left; } ]]></style> </head> <body> <form enctype="multipart/form-data" method="post" action=""> <fieldset> <legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend> <input type="file" name="upfile[]" multiple/><br /> <input type="submit" value="送信" />
TaMaMhyu

2014/12/04 02:22

コメントされているとおり、まずエラーをどこかに出さないと正確な原因はわからないですね。 目視で気になるところとしては、foreachで回すのは$_FILES["file"]["error"]ではなく、$_FILES["file"]ではないかと思います。 あとforeachの使用方法がおかしいので、ドキュメントをよく読んだほうがいいかと思います。
TaMaMhyu

2014/12/04 02:27

若干適当なコメントをしてしまいました。失礼しました。
TaMaMhyu

2014/12/04 02:32

とりあえず、foreachのブロックの中にひと通り処理を入れるというところでしょうか。コメントに載っているものだと、変数に代入するだけでただ回しているだけのようなので…
shinshin

2014/12/04 03:30

サイトの本人様ですか、参考にさせて頂いております。ありがとうございます。 エラー内容ですが、 This page contains the following errors: error on line 18 at column 25: Specification mandate value for attribute multiple Below is a rendering of the page up to the first error. と出ています。 コードの部分で言うと // データベースに接続 16 $pdo = new PDO( 17 'mysql:host=localhost;dbname=imagedb;charset=utf8', 18 'root', 19 'root', です。 エラーの内容が分からないので検索してみてあってるかわからないのですが、 権限がないorコードが間違っているという事でしょうか? エラーの意味と解決方法を教えて頂けたらありがたいです。 よろしくお願いします。
TaMaMhyu

2014/12/04 04:48

なにやらHTMLとかXMLとかのエラーのように見受けられます。HTMLソースコード上の場所を見ないとわからないかもしれません。
shinshin

2014/12/04 05:12

そうなんですね。 HTMLは元の動くコードから <input type="file" name="upfile[ ]" multiple/><br /> の部分だけ変更しています。 forechは今リファレンスを見ていますがまだ正しいコードがわかりません。 間違いありましたらご指摘頂けたらありがたいです。 よろしくお願いします。 <?php /* HTML特殊文字をエスケープする関数 */ function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } // XHTMLとしてブラウザに認識させる // (IE8以下はサポート対象外w) header('Content-Type: application/xhtml+xml; charset=utf-8'); try { // データベースに接続 $pdo = new PDO( 'mysql:host=localhost;dbname=imagedb;charset=utf8', 'root', 'pc12', [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); /* アップロードがあったとき */ if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) { // バッファリングを開始 ob_start(); try { // 1つずつ処理 foreach ($_FILES["file"] as $key => $value) { // ファイル名 $file_name = $_FILES["file"]["name"][$key]; // ファイルタイプ(MIME) $file_type = $_FILES["file"]["type"][$key]; // ファイルサイズ(byte) $file_size = $_FILES["file"]["size"][$key]; // 一時的に保存された場所へのパス $file_temp = $_FILES["file"]["tmp_name"][$key]; } // サムネイルをバッファに出力 $create = str_replace('/', 'createfrom', $info['mime']); $output = str_replace('/', '', $info['mime']); if ($info[0] >= $info[1]) { $dst_w = 120; $dst_h = ceil(120 * $info[1] / max($info[0], 1)); } else { $dst_w = ceil(120 * $info[0] / max($info[1], 1)); $dst_h = 120; } $dst = imagecreatetruecolor($dst_w, $dst_h); imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]); $output($dst); imagedestroy($src); imagedestroy($dst); // INSERT処理 $stmt = $pdo->prepare('INSERT INTO image(name,type,raw_data,thumb_data,date) VALUES(?,?,?,?,?)'); $stmt->execute([ $_FILES['upfile']['name'], $info[2], file_get_contents($_FILES['upfile']['tmp_name']), ob_get_clean(), // バッファからデータを取得してクリア (new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'), ]); $msgs[] = ['green', 'ファイルは正常にアップロードされました']; } catch (RuntimeException $e) { while (ob_get_level()) { ob_end_clean(); // バッファをクリア } http_response_code($e instanceof PDOException ? 500 : $e->getCode()); $msgs[] = ['red', $e->getMessage()]; } /* ID指定があったとき */ } elseif (isset($_GET['id'])) { try { $stmt = $pdo->prepare('SELECT type, raw_data FROM image WHERE id = ? LIMIT 1'); $stmt->bindValue(1, $_GET['id'], PDO::PARAM_INT); $stmt->execute(); if (!$row = $stmt->fetch()) { throw new RuntimeException('該当する画像は存在しません', 404); } header('X-Content-Type-Options: nosniff'); header('Content-Type: ' . image_type_to_mime_type($row['type'])); echo $row['raw_data']; exit; } catch (RuntimeException $e) { http_response_code($e instanceof PDOException ? 500 : $e->getCode()); $msgs[] = ['red', $e->getMessage()]; } } // サムネイル一覧取得 $rows = $pdo->query('SELECT id,name,type,thumb_data,date FROM image ORDER BY date DESC')->fetchAll(); } catch (PDOException $e) { http_response_code(500); $msgs[] = ['red', $e->getMessage()]; } ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>画像アップロード</title> <style><![CDATA[ fieldset { margin: 10px; } legend { font-size: 12pt; } img { border: none; float: left; } ]]></style> </head> <body> <form enctype="multipart/form-data" method="post" action=""> <fieldset> <legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend> <input type="file" name="upfile[]" multiple/><br /> <input type="submit" value="送信" /> </fieldset> </form> <?php if (!empty($msgs)): ?> <fieldset> <legend>メッセージ</legend> <?php foreach ($msgs as $msg): ?> <ul> <li style="color:<?=h($msg[0])?>;"><?=h($msg[1])?></li> </ul> <?php endforeach; ?> </fieldset> <?php endif; ?> <?php if (!empty($rows)): ?> <fieldset> <legend>サムネイル一覧(クリックすると原寸大表示)</legend> <?php foreach ($rows as $i => $row): ?> <?php if ($i): ?> <hr /> <?php endif; ?> <p> <?=sprintf( '<a href="?id=%d"><img src="data:%s;base64,%s" alt="%s" /></a>', $row['id'], image_type_to_mime_type($row['type']), base64_encode($row['thumb_data']), h($row['name']) )?><br /> ファイル名: <?=h($row['name'])?><br /> 日付: <?=h($row['date'])?><br clear="all" /> </p> <?php endforeach; ?> </fieldset> <?php endif; ?> </body> </html>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問