- ベストアンサー
PHP登録フォームの確認画面で画像を表示する方法
- PHPを勉強し始めたばかりの方が、登録フォームから送信した画像を確認画面でプレビュー表示させたいという質問です。
- 具体的な質問は、sessionを使わずに$_FILESを使用して画像を表示することができるのか、$_FILESから画像を表示するための正しい方法があるのか、また、PHPをimg要素に挿入することができるのかについてです。
- 質問者は、PHPの本には確認画面を経由せずに画像をアップロードし、プレビューに関する情報が見当たらなかったと述べています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$_FILESはそのスクリプト終了するまでしか存在しません。$_FILES['UseImg']['tmp_name']の位置にあるデータ自体も同様です。スクリプトがimg要素を返して、そのimg要素のsrc属性に指定したphpスクリプトに(画像を表示するために)ブラウザがアクセスしたときにはすでに跡形もありません。そもそも$_FILES['UseImg']['tmp_name']はフルパス(サーバパス)なので、httpスキームになっていません(httpでアクセス出来る場所ではありません)。 $_FILESが有効なうちに表示までしてしまおうと思えば、img要素にdataスキームでバイナリデータを埋め込むしかありませんが、どうせセッション変数に画像データを保持するならセッション変数から表示するスクリプトにした方が手っ取り早いとおもいます(無理にdataスキームを使うこともない)。 提示されたUseImg.phpは(セミコロンの漏れが何箇所かあるので)文法エラーになりますよね(ブラウザから直接UseImg.phpにアクセスし直せば自明です)。下記のように書き替えればちゃんと動くと思います。 <?php session_start(); if (!isset($_SESSION['UseImg'])) { die('abort'); } switch ($_SESSION['UseImg']['type']) { case IMAGETYPE_JPEG: header('content-type: image/jpeg'); break; case IMAGETYPE_PNG: header('content-type: image/png'); break; case IMAGETYPE_GIF: header('content-type: image/gif'); break; } echo $_SESSION['UseImg']['data'];
その他の回答 (1)
- t_ohta
- ベストアンサー率38% (5238/13705)
1.$_FILES とセッションは関係無いので、セッションを使わずに実装することは可能です。 但し、サーバサイドでデータの引き回しが出来なくなるので、ページ遷移する際に必要なデータはPOST等で引き回さなければいけません。 2.一時保存場所は通常外部からアクセスできない場所にあるので、外部からアクセスできる所へファイルを移動させるか、画像データをdataスキームで出力してやる必要があります。 https://www.softel.co.jp/blogs/tech/archives/2117 3.PHPで処理することは可能ですが、画像データはバイナリーなので途中に改行が混ざったりするとブラウザは壊れたバイナリーファイルと認識する可能性が有ります。 表示されなかった際のブラウザ側、サーバ側のエラーメッセージはありますか? その内容が判れば原因が特定できるでしょう。
お礼
迅速なお答え、本当にありがとうございます。 確認した後、mysqlに保存するつもりですので、sessionで処理しようと思います。 また、2番の件に関して、詳しくありがとうございました。なるほど、外部からは取り出しできないんですね。dataスキームに関しては、これから調べてみようと思います。 3は、エラーは出ておりません。file2.phpのソースを見ると、<img src="UseImg.php" />しかありませんでした。 UseImg.phpファイルを、 <?php session_start();if (!isset($_SESSION['UseImg'])) { die('abort'); }switch ($_SESSION['UseImg']['type']) {case IMAGETYPE_JPEG:header('content-type: image/jpeg');break case IMAGETYPE_PNG: header('content-type: image/png');break case IMAGETYPE_GIF:header('content-type: image/gif'); break} echo $_SESSION['UseImg']['data']のように、改行を全て消しましたが、変わりませんでした。
お礼
お陰様で期待通りの動きをしてくれました! 簡単なことにも気づかず本当にすいません。ありがとうございます!! もしお時間がございましたら、考え方の確認にお付き合いくださるととても嬉しいのですが…… 「tmp_nameのデータをfile_get_contentsで文字列として読み込み、それをimgの中に入れ表示している」んですよね……? この文字列はバイナリななのでしょうか。そうだとすると、 $_SESSION['UseImg']['data'] = file_get_contents($_FILES['UseImg']['tmp_name']); $_SESSION['UseImg']['size'] = $_FILES['UseImg']['size']; ------ $size = $_SESSION['UseImg']['size']; $tmp = $_SESSION['UseImg']['data']; $data1 = $freed($tmp, $size) $data2 = bin2hex($data1); とすることによって、16進法にすることができると考えたのですが、残念ながらできませんでした。私の理解の仕方、間違っているのでしょうか……
補足
すいません、お礼に書いたコードにあやまりがありました。 $data1 = fread($tmp, $size); $data = bin2hex("$data1"); です。 が、Warning: fread() expects parameter 1 to be resource,のエラーが出てしまいました…… そこで、freadの部分を消して、$data = bin2hex("$tmp");のみにしたら無事mysqlの中に挿入できました。freadの理解が間違っていたようです。