Apache,phpで画像が表示されない

このQ&Aのポイント
  • Apache2.2、php5を使用しています。非公開のディレクトリの画像を表示させるようにphpのプログラムを呼び出していますが、画像が表示されない状態です。
  • header関数やfopen関数を使用して処理を行っていますが、小さい画像ファイルでは処理が終わりますが、大きい画像ファイルでは処理が中断されてしまいます。
  • エラーログには情報が残っていないため、この問題の原因を特定するためのヒントが必要です。
回答を見る
  • ベストアンサー

Apache,phpで画像が表示されない

こんにちは Apache2.2、php5を使用しています。 ブラウザに画像を表示させたいのですが、URLで直接画像ファイルを指定するとファイルの場所を見せてしまうので、非公開のディレクトリの画像を表示させるようにphpのプログラムを呼び出して(引数をファイル名)にしています。 画像が「X」の状態で表示されません。(涙 header('Content-Type: ' . 'image/jpeg'); header('Content-transfer-encoding: binary'); header('Content-length: ' . filesize(/.../../$fileName)); header('Content-Disposition: attachment; filename="' . $fileName . '"'); のあとで、fopen() ->> fpassthru();で処理したのですが、小さい画像ファイルは処理は終わっていますが、「X」の状態で表示されて、大きい画像ファイルを指定するとfpassthru()の中で死んでしまいます。 fread ->> print ->> flush()ループで処理すると、flushの中で死んでしまいます。 error.logにも特に情報が残っていないので... 何かご存知の方はいらっしゃいませんか? よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>ご指摘頂いたのHeaderは修正しましたが、画像は「X」の状態で... >URLでファイルを指定するといまくいくのですが... 画像を吐き出すPHPファイルのURLを、ブラウザのアドレスバーに直接入力した場合はうまくいくけれども、そのURLをHTML内のimgタグのsrc属性に指定した場合はダメということでしょうか? そうであれば、単なるHTMLの書き間違えか、PHP内でリファラーで何か処理を変えているくらいしか思いつきません。

tobiuma
質問者

補足

>URLでファイルを指定するといまくいくのですが... これは、URLでファイルを指定するといまくいくが、PHPで吐き出すとうまくいかないって意味で書きました。 分かりにくくてすいません。 phpで吐き出す前に、セキュリティ関係の処理phpを呼んでいたので、その処理の前で強引にfile_get_contents( )するとうまくいく事がわかりました。いまだに本当の原因は判明しておりませんが、あとはなんとかなると思います。 お騒がせして申し訳ありませんでした。fdsjaklfjasさんの過去の回答も参考にさせて頂きました。 たいへんありがとうございました。

その他の回答 (1)

回答No.1

ヘッダの設定が怪しいと思います。 header('Content-length: ' . filesize(/.../../$fileName)); →ご質問の問題の原因はコレだと思います。パスがおかしくないですか? Content-Lengthヘッダが0になりませんか? header('Content-transfer-encoding: binary'); →HTTP1.1では廃止されていますし、一般的には付けないと思います。 header('Content-Disposition: attachment; filename="' . $fileName . '"'); →このケースでは、このヘッダはいらないと思います。 >fopen() ->> fpassthru(); readfile関数だと一行ですみますよ。せっかくPHP使っているのだったら、ラクしないと損です。

tobiuma
質問者

補足

回答ありがとうございます。 質問の書き方がわるくて申し訳ありません。 header('Content-length: ' . filesize(/.../../$fileName)); これは、実際には正常にファイルを記述しています。 ご指摘頂いたのHeaderは修正しましたが、画像は「X」の状態で... URLでファイルを指定するといまくいくのですが... file_get_contents( )やreadfile( )に変えると処理は正常に終了するようになりました。 でも、画像は「X」の状態から変わらないのです...

関連するQ&A

  • PHP 画像の表示

    プログラミング初心者です。 PHPでブラウザに画像を表示したいのですが映らなくて 以下のソースコードは間違っているでしょうか? <?php $fileName = "img/test.jpg"; //ファイル名 if (file_exists($fileName)) { header('Content-type: image/jpeg'); header('Content-Length: '.filesize("http://localhost:8080/test.jpg")); //あった方が良い readfile("http://localhost:8080/test.jpg"); //ファイルを読み込んで標準出力に書き出し exit; } ?>

    • ベストアンサー
    • PHP
  • ダウンロードさせると*.phpにリネームされてしまう。

    phpでファイルのダウンローダを作成したのですが、IEで動かすと*.phpと動作しているphpのスクリプトネームにリネームされてしまいます。 FireFoxではリネームされる事無くダウンロードされるのですが、IEでの解決方法をご存知の方、どうぞご教授くださいませ。 コードは $filesize=filesize($filedldir); header ("Accept-Ranges: none"); header ("Content-Length: $filesize"); header ("Content-Type: application/octet-stream"); header ("Content-Disposition: attachment; filename=$fnames"); readfile ($filedldir); exit; といった感じです。 何がおかしいのでしょうか?

    • ベストアンサー
    • PHP
  • PHPによるファイルのダウンロード

    初めまして最近ちょっとはまってしまっているので分る方がいましたらアドバイスお願いします。 PHPのheader関数を使ってブラウザのダイアログを表示させるファイルのダウンロードを実装した際に、ファイルサイズが大きいものをダウンロードしているとダウンロードが完了するまで他のアクセスが応答しなくなる場合があります。 基本的には $fp = fopen($filePath, "rb"); $contents = fread($fp, filesize($filePath)); fclose($fp); $len = strlen($contents); header("Content-type: application/octet-stream"); header('Content-disposition: inline; filename="' . $filename . '"'); header("Content-length: " . $len); echo $contents; というような一般的な書き方をしています。 ファイルのサイズ的には10MB前後です。 同じような現象を解決された方がいましたらアドバイス頂けると幸いです。

    • 締切済み
    • PHP
  • PHPでのファイルのダウンロードについて

    お世話になります。 タイトルのとおりPHPでファイルのダウンロードを行いたいのですが、 ファイルを保存するというダイアログが出てくれません。 tesuto.php <?php $file="/work/tesuto.csv"; header ("Content-Disposition: attachment; filename=$file"); header ("Content-type: application/x-csv"); readfile ($file); ?> tesuto.phpを実行するとダウンロードされずに、ファイルの中身が表示されてしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP getimagesize();

    プログラミング初心者です。 現在、PHPにてブラウザに画像の表示をしようとしているのですが 上手く行きません。ソースコードを張るのでダメなところがありましたら 手ほどきの程お願い致します。 ーーーーー <?php $fileName = "test.jpg"; //ファイル名 if (file_exists($fileName)) { header('Content-type: image/jpeg'); header('Content-Length: '.filesize($fileName)); //あった方が良い readfile($fileName); //ファイルを読み込んで標準出力に書き出し ★getimagesize(test.jpg); exit; }else{ echo "b"; } ?> ーーーー 目的 - phpにてブラウザに画像の表示 状況 - 最初は★のある行はなしでやっていたが 画像が映るも、かなり小さかったので大きくしようと ★のある行を追加。 - 画像の小ささはスクリーンショットを参考

    • ベストアンサー
    • PHP
  • PHPで複数ファイルのダウンロード

    はじめまして、PHPについて質問させていただきます。 PHPでファイルを複数ダウンロードできるようしたいと思っています。 色々調べ、header関数を使用し、以下のように記述すると ファイルのダウンロードは成功しました。 /*****************************************/ // ダウンロードさせる元ファイル(絶対パス) $filepath = 'test_01.pdf'; // 保存時のファイル名(デフォルト) $filename = 'download001.pdf'; // HTTPヘッダ送信 header("Content-length: " . filesize($filepath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($filepath); /*****************************************/ 一つのファイルのダウンロードに成功したので、 次に複数のファイルを順番にダウンロードをさせる為にループ処理をしました。 /*****************************************/ //配列 複数ファイル $downfile = array("test_01","test_02","test_03"); //データ数 $max = count($downfile); // ダウンロードさせるディレクトリ(絶対パス) $filepath = "/home/sites/www.eshop-himawari.com/web/test_nihon/form_down/file/"; // 保存時のファイル名(デフォルト) $filename = "download"; $filetype = ".pdf"; $kazu = 1; //ループ処理 for( $i = 0; $i < count( $max ); $i++ ){ $downpath = $filepath.$downfile[$i].$filetype; $filename = $filename.$kazu.$filetype; $kazu = $kazu++; // HTTPヘッダ送信 header("Content-length: " . filesize($downpath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($downpath); // $fp = fopen( "$downpath", "rb" ); // @fpassthru( $fp ); } /*****************************************/ しかし実行すると最初のファイルはダウンロードしますが 2つ目からのファイルはダウンロードされませんでした。 きちんとループ処理をされて、2つ目以降のファイルをダウンロード するには、どうすればいいのでしょうか?

    • 締切済み
    • PHP
  • PHPでバックアップ

    PHP初学者です、よろしくお願い致します。 PHPでバックアップを取りたく、次の様にしてみたのですが、実行するとファイルは正しいサイズでダウンロードされるのですが解凍すると中身は空になっています。できたファイルをFTPで別途ダウンロードして解凍してみると正常です。 $file = $storedir.$generatefile; $tstr = 'tar -C '.$upperdir. ' -czf '.$storedir.$generatefile.' '.$targetfolder; $result = system($tstr, $retval); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); } ファイルが出来上がっていないのにダウンロードが始まってしまうからでしょうか?もしそうならファイルが出来上がってからダウンロードが始まるようにするにはどうしたら良いでしょうか? 根本的にやり方が良くないようでしたらそれもご指摘いただければありがたいです。よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP:wavファイルのダウンロード

    音楽ファイルを会員に配信するサイトを運営しています。 mp3は問題なくダウンロード・再生できるのですが、wavファイルはダウンロードしてもファイルが破壊されており、再生できません。 wavファイルのバイト数に変化はありませんでした。FTPからファイルをダウンロードすると正常に再生できるので、問題はウェブでのダウンロードをする過程にあることは分かっています。いろいろ調べているのですがそれ以降の原因が分からず困っています。 誰か原因をご存知の方、目星の付く方などおられましたら、ぜひ解答お願いいたします。 ファイルダウンロードには、以下のようなphp関数を使っています。 function download_file($path_file){ if (!file_exists($path_file)) { die("Error: No Such File."); } if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } if($_POST['sort'] == mp3){ header("Content-Type: audio/mpeg"); }elseif($_POST['sort'] == wav){ header("Content-Type: audio/x-wav"); } header("Content-Disposition: attachment; filename=\"" .basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Transfer-Encoding: binary"); $handle = fopen($path_file, 'rb'); while (!feof($handle)) { echo fread($handle, 4096); ob_flush(); flush(); } fclose($handle); }

    • 締切済み
    • PHP
  • PHP CSV 出力

    失礼します。 現在PHPで指定したパスに置いてあるCSVを出力したいのですが、 CSVは出力できているのですが、HTMLが先頭に入ってしまいます。 htmlファイルに設置したボタンに対して phpファイルで処理をしています。 どこかおかしい部分があればご教授頂きたいです。 HTMLファイル <?php $self = $_SERVER["SCRIPT_NAME"]; ?> <form method='POST' action='<?php $self ?>'> <input type='submit' value='CSV出力' name='get_csv'> </form> PHPファイル function This_Month(){ $filepath = 'hoge.csv'; //ダウンロードしたいファイルパス $filename = 'test.csv'; //ダウンロードした際のファイル名 if(!file_exists($filepath)){ die("Error:File(".$filepath.") does not exist"); } //オープンできるか確認 if(!($fp = fopen($filepath,"r"))) { die("Error:Cannot open the file(".$filepath.")"); } fclose($fp); //ファイルサイズの確認 if(($content_length = filesize($filepath)) == 0){ die("Error:File size is 0.(".$filepath.")"); } //ファイルの処理方法 header('Content-Disposition: attachement; filename="'.$filename.'"'); //ファイルタイプ指定 header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding:binary'); //ファイルサイズ header('Content-Length: '.filesize($filepath)); mb_convert_encoding($filepath,'utf-8','shift-jis'); readfile($filepath); exit(); } //ボタンに合わせて条件を変えていく if(isset($_POST["get_csv"])){ //ユーザーから来たデータをエスケープする $csv_output = htmlspecialchars($_POST["get_csv"], ENT_QUOTES, "UTF-8"); switch ($csv_output) { case "CSV出力": ”This_Month();  break; default: echo "エラー"; exit; } }

    • ベストアンサー
    • PHP
  • PHPにてCSV出力及び結果文字列出力

    PHPにてCSVファイル出力後、完了メッセージを表示することは可能でしょうか? htmlからのsubmitによりデータベースより取得したデータをCSVファイルのダウンロードをPHPにて行っています。 ファイル保存ダイアログを表示させ、なおかつhtml上のメッセージエリアに「○○件出力しました。」等のメッセージを表示させたいのですが、やり方がわかりません。 それぞれの処理自体は別々に行えば可能でした。 ・PHPのファイルダウンロード ----------------------------------------------------- header("Content-Type: application/csv"); header("Content-Disposition: attachment; filename=" . $fileName); header("Content-Length:".filesize($fileNameTmp)); readfile($fileNameTmp); ----------------------------------------------------- ・メッセージ表示 iframeを作成しformのtargetをそのiframeにし PHPコードの下に下記コードを入れる ----------------------------------------------------- <html><head> <script type="text/javascript"> <!-- window.onload=function(){ if(window.parent) { window.parent.showMsg('<?php echo $GLOBALS["strMsg"] ?>'); } }; //--> </script> </head><body></body></html> ----------------------------------------------------- また、構成上画面遷移→ダウンロードは使えません。 PHP:5.6.3 jQuery:1.11.1 IE8の動作も可能にしたいため、HTML5はなしで。 ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう