• 締切済み

バイナリファイルをダウンロードできなくなりました。

バイナリファイルをダウンロードできなくなりました。 以下のように、fopen で取得したバイナリデータをブラウザにダウンロードさせていましたが、ある時からダウンロードできなくなりました。 ・プログラムコードは変更していません。 ・同様の処理をしている全ての箇所が失敗するようになりました。 ・いずれも、かつては正常に動作していました。 ・ApacheやPHPはエラーメッセージを出力していません。 Apacheの設定またはPHPの設定を変えてしまったのかな、と推測していますが、原因がつかめていません。 検討がつかないので困っています。推測できる原因をご提示ください。 [環境] CentOS 5.3 (ルート権限も持っている、完全にコントロールできる環境です) PHP 5.1.6 Apache 2.2.3 [問題のコード その1] $ret=''; $handle = @fopen($file_name, 'r'); if ($handle) { while (!feof($handle)) $ret.=fread($handle, 8192); fclose($handle); } header('Content-disposition: attachment; filename="'.$src.'"'); header('Content-type: audio/3gpp'); header('Cache-Control: private'); header('x-jphone-copyright: no-transfer'); die($ret); [問題のコード その2] $url = "http://chart.apis.google.com/chart?".http_build_query($query); $img = @imagecreatefrompng($urls); $img = @imagerotate($img,270,0); header('Content-Type: image/jpeg'); imagejpeg($img); [問題のコード その3] $url = "http://example.net/example.php"; $options = array('http' => array( "method" => 'POST', "header" => "Content-Type: application/x-www-form-urlencoded\r\n" "content" => http_build_query($data), )); $contents = @file_get_contents($url, false, stream_context_create($options)); //書きだし header('Content-Type: application/x-shockwave-flash'); header('Content-Length: '.strlen($contents)); print $contents;

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

みんなの回答

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

>プログラムコードは変更していません。 ってのが、『これらの部分は変更していません』って意味なのか、本当にまったく変更していないのか。 error_reporting(E_ALL); とかで、すべてのエラーメッセージ表示するようにしてみれば原因が掴めるかも知れません。 なんとなく、どこかで何らかの出力(広告など)を追加したせいで、 header で『既に本文が出力されています』エラー(正確にはワーニングだったかな)が発生しているというのが濃厚ではないかという気がしなくもありませんが。

may_flower
質問者

補足

>『これらの部分は変更していません』って意味なのか、本当にまったく変更していないのか。 「本当にまったく変更していない」です。 >error_reporting(E_ALL); もともとこうしています。 headerを先んじて出力している、という線は、Apacheの設定であり得ますね。 一応もう一度チェックしてみたいと思います。

noname#111181
noname#111181
回答No.1

そのバイナリファイル(またはURL)が、ブラウザないしはセキュリティ対策ソフトの拒否リストに入ってしまったのではないでしょうか。 ご確認下さい。

may_flower
質問者

お礼

ご回答ありがとうございます。 die(header('Location: …')); という風にリダイレクトさせると表示できるので、ファイルやURLに問題はありません。 そして、このサイトはモバイル向けなので、セキュリティソフトが急に追加されたようなこともありません。

may_flower
質問者

補足

文中に書き損じがありました。訂正します。 誤) $img = @imagecreatefrompng($urls); 正) $img = @imagecreatefrompng($url); 投稿するためにコードを整理した際に書き損じました。 これが今回のトラブルの原因ではありません。 よろしくお願いします。

関連するQ&A

  • バイナリファイルをブラウザに表示させる時のタイトルバーについて

    バイナリファイルダウンロードに関して伺いたいことがあります。 PHPでバイナリファイル(ExcelやPDF)をブラウザ内にダウンロードさせる場合は、下記のような設定をするかと思います。 header('Content-Type: application/octet-stream'); header('Content-Description: '.$filename); header('Content-Disposition: inline; filename='.$filename); このようにしてブラウザ内での出力は可能なのですが、 この場合ブラウザのタイトルバーにURLが出力されます。 URLはセキュリティ上、表示したくないようなケースの場合 何か設定方法はあるのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • cgiで表示するhtmlページ内でバイナリ画像を出力したい

    cgiで表示するhtmlページ内でバイナリ画像を出力したい 「CGI 画像出力」でググったページで下記のコードがありました。 下記コードは、 Content-typeをimage/gif等にして バイナリを print すれば表示される という書き方になっていると思いますが、 content-typeがtext/html のページ内でバイナリをprintした場合 バイナリが文字列としてグシャァァァと表示されてしまいます。 ------- $view = 'aaa.jpg'; print "Content-type: image/jpeg\n\n"; #コンテンツタイプを指定する open IMGG,"$view"; #ファイルハンドル IMGGに画像ファイルを読み込む binmode (IMGG); #画像なのでバイナリモードに設定する print <IMGG>; #ファイルハンドルを画面に書き出す close (IMGG); #ファイルハンドルを閉じる exit; ------- content-typeがtext/htmlの状態でバイナリの画像を表示するには どうすればよいのでしょうか? cgiを2つ用意して、上記のコードを img src=~~.cgi という形で 呼び出すしかないのでしょうか?

    • ベストアンサー
    • Perl
  • 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
  • Content-Disposition: inlineの必要性?

    下記の例で、exampe.jpgをindex.htmlに、index.phpを介して、読み込ませる(表示する)場合、私が参考にしたコードではindex.phpのコードは以下の例のようになりますが(ちゃんと動作します)、なぜ「header("Content-Disposition: inline; filename=" . "example.jpg");」がindex.phpに必要なのか分かりません(どのような働きをしているのか?)。 私の場合、index.htmlからexample.jpgをダウンロードさせることは想定しておらず、ただexampe.jpgをindex.htmlに表示させたいだけです(実際には、example.jpgのダウンロード等を防ぐ目的の一部としてexample.jpg をcacheさせないためにindex.phpを利用しています。)。この場合でもやはり「header("Content-Disposition: inline; filename=" . "example.jpg");」がindex.phpに記述されていたほうが良いのでしょうか? 例: ディレクトリ構成(/var/www/htmlが公開ディレクトリ) /var/www/html/example.jpg /var/www/html/index.html /var/www/html/index.php - index.html: <img src="index.php" width="100" height="100" border="0"> - index.php: header("Content-type: image/jpeg"); header("Content-Disposition: inline; filename=" . "example.jpg"); header("Content-length: " . filesize("example.jpg")); readfile("example.jpg"); しかし、実際には、 - index.php: header("Content-type: image/jpeg"); header("Content-length: " . filesize("example.jpg")); readfile("example.jpg"); のように「header("Content-Disposition: inline; filename=" . "example.jpg");」なしでもexample.jpgはちゃんとindex.htmlに表示されます。 この質問に関連する情報が記載されたサイト等も、ご存知でしたらURLをお教えください。 よろしくお願いします。

    • 締切済み
    • PHP
  • バイナリファイルのアップロードに関して

    今回質問させて頂くことに関連した問題を、現在MySQLのカテゴリで質問させていただいているのですが、 バイナリファイルをアップロードし、そのファイルのバイナリデータを変数($img)に格納し、それをDBに格納するという形を目指しています。しかし、DBにどうしても格納できません。もしやバイナリデータを変数に格納する時点で、既におかしいのかと思いまして、その部分についてこちらでご教授頂きたく書き込ませていただきました。 #!C:\Perl use CGI; use DBI; $PCMOJPATH='C:\パス名'; #ディレクトリ指定 my ($buffer); my $query = new CGI; $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; #ファイル名 print "Content-type: text/html\n\n"; print "<html><body>\n"; my $fH = $query->upload('filename'); my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; open (OUT, ">$PCMOJPATH/$newfile"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; $img .= $buffer;   #バイナリデータを$imgに格納 } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$PCMOJPATH/$newfile"); ------------------------- と書いているのですが、$imgにはバイナリデータがちゃんと入っていないのでしょうか?間違っているところがあれば、どのように直したらいいか教えてください。どうぞよろしくお願いします。

  • DBに格納されたバイナリデータを画像表示する方法

    PHP初心者ですみません。PHP、PSQLでDBにアップロードされた画像データ(バイナリデータ)をWEB上で例<img src=image.php>画像表示したいのですが、画像が×表示になってしまいます。格納時にデータが間違っているのか?それとも表示方法が間違っているのかわかりません。どなたか助けてください。 【アップファイル格納時スクリプト】 //fopenして変数に保存 $fp = fopen($_FILES["upfile"]["tmp_name"],"r"); $imagedata = fread($fp,filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); //バイナリデータをエスケープ $imagedata = pg_escape_bytea($imagedata); $filename = $_FILES["upfile"]["name"]; $sql_g = "update img set img_data='$imagedata'"; $conn_g = connect(); $result_g = pg_query($conn_g,$sql_g); pg_close($conn_g); } 【画像表示用ファイルスクリプトimage.php】 $sql_i = "select img_data from img"; $conn_i = connect(); $res_i = pg_query($conn_i,$sql_i); $num_i = pg_num_rows($res_i); $img_data = pg_fetch_result($res_i,0,"img_data"); header('Content-type: image/gif'); header('Content-Disposition: inline; filename=' . $img_data); print"${img_data}"; 【画像表示部分スクリプト】 <img src="http://●●●●/●●/image.php" alt="イメージ" width="500" height="100"> こんな感じなのですが、どこがどう違うのか何度も試してやっとここまできたのですが、答えがでません。お解りの方いらっしゃいましたらご指摘をどうかよろしくお願いいたします。

  • [au携帯] DBに格納されたバイナリ形式の画像を表示する方法

    [au携帯] DBに格納されたバイナリ形式の画像を表示する方法 データベース(PostgreSQL)に格納されたバイナリデータの画像をPHPを使用して元に戻し表示しようとしています。 携帯用ホームページを作成しているのですが、ドコモだとちゃんと表示されるのにAUでアクセスすると画像がバッテンになってしまって表示できません。 下記のようにPHPを使って画像を表示しているのですが何処が間違っているのでしょうか。 画像の表示用 img.php <?php //DBから必要なデータを取得します。 // $imag_data ------- バイナリ形式の画像データ // $image_file_type - 画像保存時に下のようにして取得した値 // list($width,$height,$image_file_type)=getimagesize($imgurl); // $img_name -------- 画像の名前 $imag_data = pg_unescape_bytea($imag_data); header("Content-type: " .$image_file_type); header('Content-Disposition: inline; filename="' .$img_name.'"'); print($imag_data); exit(); ?> img.phpに直接アクセスするのと、<img src='http://…img.php' />で表示してみたのですが、ドコモだと2通りともできるのに、AUだと「リクエストされたページは表示できません。」と出てしまい、困っています。 どなたか、ご教授くださいますようよろしくお願いいたします。

    • 締切済み
    • 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
  • ファイルダウンロード

    Webサーバーの公開フォルダにあるファイルを、ローカルに保存したいのですが、Linuxのように wget http://xxx.xxxx.xxx/zzzz/ddd.zipする方法をPHPで考えてます。 例 $get1 = "http//xxx.xxxx.xxx/zzz/ddd.zip"; $get2 = "ddd.zip"; header("Content-Type: application/zip"); header("Content-disposition: attachment; filename=$get2"); $fp = fopen($get1, 'rb'); ダウンロードする際にダイアログが開かないで、ローカルの指定のフォルダに保存をおこなうようにしたいです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • Zend Framework で大きなファイルをダウンロードしたい

    ホームページをtarでバックアップしてZend Frameworkでダウンロードしたいのですが、 http://php.benscom.com/manual/ja/function.readfile.php を参考に次の様にしてみたところ、数Mbyte程度のファイルはダウンロードできましたが大きなファイル(200Mbyte)ではエラーになりました。 public function DownloadAction(){ $file = "test.bin"; $this->_helper->viewRenderer->setNoRender(); $response = $this->getResponse(); $response->clearAllHeaders(); $response->clearBody(); $response->setRawHeader('Content-Description: File Transfer'); $response->setRawHeader('Content-Type: application/octet-stream'); $response->setRawHeader('Content-Disposition: attachment; filename='.basename($file)); $response->setRawHeader('Content-Transfer-Encoding: binary'); $response->setRawHeader('Expires: 0'); $response->setRawHeader('Cache-Control: must-revalidate, post-check=0, pre-check=0'); $response->setRawHeader('Pragma: public'); $response->setRawHeader('Content-Length: ' . filesize($file)); $response->sendHeaders(); $response->setBody(file_get_contents($file)); $response->outputBody(); } それで $response->setBody(file_get_contents(&$file)); $response->outputBody(); の部分を $handle = fopen($file, "rb"); $contents = ''; while (!feof($handle)) { $contents = fread($handle, 8192); $response->setBody($contents); $response->outputBody(); } fclose($handle); とかにしてみましたがこれもファイルが途中で切れてしまいました。 php.iniのメモリ量を増やす以外に、何か方法がありますでしょうか?

    • ベストアンサー
    • PHP