php MySQL 画像をまとめて送信
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,496
質問よろしくお願いします。
現在phpを使いデータベースと連携するandroid,iosのアプリ作成をしているのですが、
画像をまとめてデータベースに保存、読み出しができずにつまづいています。
http://qiita.com/mpyw/items/117ab6a88fd58d911c34
(自分のコードを張り付けるとフリーズして質問途中で終わるので)参考にさせていただいたサイトをそのまま張りますが、
こちらを参考にして画像を1つずつなら送信できたのですが、ここからまとめて画像で送るというのができません。
multipleを使い、for文で回す、という事をすればいいと思うのですができません。
アドバイスや参考になるサイト、できたらソースコード等教えて頂けたらありがたいです。
よろしくお願いします。
現在phpを使いデータベースと連携するandroid,iosのアプリ作成をしているのですが、
画像をまとめてデータベースに保存、読み出しができずにつまづいています。
http://qiita.com/mpyw/items/117ab6a88fd58d911c34
(自分のコードを張り付けるとフリーズして質問途中で終わるので)参考にさせていただいたサイトをそのまま張りますが、
こちらを参考にして画像を1つずつなら送信できたのですが、ここからまとめて画像で送るというのができません。
multipleを使い、for文で回す、という事をすればいいと思うのですができません。
アドバイスや参考になるサイト、できたらソースコード等教えて頂けたらありがたいです。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+19
input
要素のname
属性は配列になっていますか?
配列にせず、同じ
name
属性でアップロードするとうまくいかないので、たとえばname="file"
としている場合はname="file[]"
という風に[]
をつけてあげます。
そうすると
PHP
にfile
という配列で渡るので以下のようにしてループを回すことができるようになります。
// 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];
}
どういう処理になっているのか把握しきれないので想像で回答しました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2014/12/04 03: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="送信" />
2014/12/04 08:21
>> 真っ白なページになります。
とりあえずphp.iniの設定をいじって全てのエラーを表示するようにしましょう。
http://qiita.com/mpyw/items/2f9955db1c02eeef43ea#%E5%85%A8%E3%81%A6%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA
2014/12/04 11:22
目視で気になるところとしては、foreachで回すのは$_FILES["file"]["error"]ではなく、$_FILES["file"]ではないかと思います。
あとforeachの使用方法がおかしいので、ドキュメントをよく読んだほうがいいかと思います。
2014/12/04 11:27
2014/12/04 11:32
2014/12/04 12: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コードが間違っているという事でしょうか?
エラーの意味と解決方法を教えて頂けたらありがたいです。
よろしくお願いします。
2014/12/04 13:48
2014/12/04 14: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>