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

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

ただいまの
回答率

88.23%

php MySQL 画像をまとめて送信

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,496

shinshin

score 32

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

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

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

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

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

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

よろしくお願いします。


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+19


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

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

// 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];
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

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

    キャンセル

  • 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>

    キャンセル

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る