電子書籍の厳選無料作品が豊富!

アップロードした画像をうまく表示できません。

a.php というスクリプトファイルを作成しました。
その中身の構成は、

1. [2.]の結果として戻ってきた場合のみ、画像を所定の場所に保存し、表示するスクリプト
2. formの<input type="file">があるスクリプト。戻り先はこのスクリプトがある、a.phpというファイル

というようになっております。

2.のsubmitボタンを押して結果を確認したところ、画像はきちんと所定の場所に保存されるのですが、その時点ではうまく表示されません。「更新」ボタンを押して初めて画像が表示されます。

これを2.のsubmitボタンを押して、戻ってきた瞬間に表示させることは出来ないものでしょうか。教えて頂けると助かります。どうぞ宜しくお願いします。

A 回答 (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');
?>
    • good
    • 0
この回答へのお礼

なるほど、これでうまく行きそうです!!
本当にご親切に、的確なアドバイスを頂き、
どうもありがとうございました。

お礼日時:2006/12/03 23:00

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しないで、きちんと表示できないか、悩み中です。。

補足日時:2006/12/03 02:21
    • good
    • 0

プログラムのご提示がないので、動作からの推測です。



>画像を所定の場所に保存し、表示するスクリプト

「保存」できちんと保存されていないのではないかと思います。
ファイルの書き出しをした直後に(表示する処理の前に)、一旦ファイルの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=\"送信\">";

補足日時:2006/12/01 23:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!