- ベストアンサー
アップロードした画像を表示できない問題の解決方法
- アップロードした画像を表示できない問題について、解決方法をご紹介します。
- a.phpというスクリプトファイルを作成し、画像の保存と表示を行う方法があります。
- 一度画像を保存した後に、更新ボタンを押すことで画像が正しく表示されるようになります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
やっと現象が理解できました。古い画像が表示されるということですね。キャッシュの問題だと思います。 PHPでできる一番簡単な対策は、test.phpのimgタグのURLの後ろにダミーパラメータを付ける方法かなと思います。 echo "<img src=\"$picture_file_path?". rand(). "\" width=\"100\" height=\"100\">"; header関数でレスポンスを操作する場合、test.phpでやっても効果が無いです。画像のレスポンスヘッダをいじる必要があります。 その場合、test.phpでは echo "<img src=\"img.php\" width=\"100\" height=\"100\">"; としておいて、以下のようなimg.phpを作ります。 === img.php ============== <?php // Content-Typeヘッダ出力 header('Content-type: image/jpeg'); // キャッシュをさせないためのHTTPヘッダを出す (省略)← 無くても多分大丈夫です // test.jpgをレスポンス echo file_get_contents('test.jpg'); ?>
その他の回答 (2)
- fdsjaklfjas
- ベストアンサー率81% (96/118)
ANO1の者です。ファイルアップロードですから、move_uploaded_fileを使いますよね。ボケた回答ですみませんでした。忘れて下さい。 ソースコードのご提示があったので、自分の環境でやってみたのですが、全く問題なく動きました。 bumpei617さんの環境で動かない理由はよく判りませんが、サーバのエラーログをみれば、test.jpgをブラウザが取りに行ってNot Foundになっているのか、あるいはブラウザのキャッシュなどでそもそも画像ファイルを取りに行っていないのかは判ります。なので、まずはエラーログを再確認してみては如何でしょうか。
補足
ありがとうございます。 エラーログの確認方法を把握するのに、少し手間取っていますが、 何とか確認してみます。 ちなみにキャッシュの問題というのが濃厚かと思っているので、 header("Expires: Sat, 01 Jan 2000 00:00:00 GMT"); // Date in the past header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT"); // always modified header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Pragma: no-cache"); // HTTP/1.0 というコードをさしはさみましたが、だめでした。 古い画像が表示されるままです。 header("Refresh: 0; url=a.php'"); の一行があれば、切り替わった時に正しい画面が表示されるのですが、わざわざrefreshしないで、きちんと表示できないか、悩み中です。。
- fdsjaklfjas
- ベストアンサー率81% (96/118)
プログラムのご提示がないので、動作からの推測です。 >画像を所定の場所に保存し、表示するスクリプト 「保存」できちんと保存されていないのではないかと思います。 ファイルの書き出しをした直後に(表示する処理の前に)、一旦ファイルのcloseなどが必要だと思うんですが、その処理が漏れてませんか?
補足
ご回答ありがとうございます! なるほど、そういう可能性もあるのですね。 ちょっと調べてみたのですが、move_uploaded_fileを使った時、 どうcloseするのか、見当たりませんでした。。 尚、下記がソースコードになります。 これを実行して頂くと分かりますが、 ファイルはアップロードされるものの、 (FTPソフトで新しい画像がアップされているのが確認できる) 表示画面が切り替わりません。 ブラウザの更新ボタンを一回押すと、正しい画像が表示されます。 またgetimagesize()を<img>タグの前に使うと、 この関数では新しい画像をきちんと認識していることが分かりました。 なので、ブラウザがローカルに一時ファイルをためていて、 新しい画像をダウンロードしていないのかなどと推測していますが。。 解決の方法は想像つきますでしょうか。 --- source --- // 1. 写真の保存、表示 // 保存 if($_POST["action"] == "y") { $picture_temp = $_FILES["picture_file"]["tmp_name"]; if( ($_FILES["picture_file"]["type"] == "image/pjpeg") or ($_FILES["picture_file"]["type"] == "image/jpeg")) { $picture_name = "test.jpg"; $picture_file_path = "../../images/pictures/$picture_name"; move_uploaded_file($picture_temp, $picture_file_path); chmod($picture_file_path, 0666); } } // 表示 echo "<img src=\"$picture_file_path\" width=\"100\" height=\"100\">"; // 2. アップロード用のフォーム echo " <form action=\"test.php\" enctype=\"multipart/form-data\" method=\"POST\"> <input type=\"hidden\" name=\"MAX_FILE_SIZE\" size=\"500000\"> <input type=\"file\" name=\"picture_file\" size=\"50\"> <input type=\"hidden\" name=\"action\" value=\"y\"> <input type=\"submit\" value=\"送信\">";
お礼
なるほど、これでうまく行きそうです!! 本当にご親切に、的確なアドバイスを頂き、 どうもありがとうございました。