jpeg画像を開かずダウンロードしてもらう方法

このQ&Aのポイント
  • 現在製作しているサイトで、写真素材(jpeg画像)を配布するのですが、対象のファイルをダウンロードしてもらう際に、「右クリックで保存してください」ではなく、クリックしたら保存のダイアログが出てくるようにしたいと思い、調べた結果、以下のページを見つけました。
  • 上記サイトを参考にして(PHP)、思っていたことが実現できたのですが、1つ問題が発生しました。ダウンロードしたjpegファイルが、「Windows画像とFAXビューア」で「プレビューできません」となってしまいます。
  • 現在、以下のように書いております。$file_length = filesize($file); header("Content-Type: image/jpeg"); header("Content-Disposition: attachment; filename=".basename($file)); header("Content-Length:$file_length"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: private"); readfile ($file);
回答を見る
  • ベストアンサー

jpeg画像を開かずダウンロードしてもらうには

現在製作しているサイトで、写真素材(jpeg画像)を配布するのですが、対象のファイルをダウンロードしてもらう際に、「右クリックで保存してください」ではなく、クリックしたら保存のダイアログが出てくるようにしたいと思い、調べた結果、以下のページを見つけました。 http://code.nanigac.com/source/view/461 http://www.abe-tatsuya.com/web_prog/perl_cgi/content_disposition.php 上記サイトを参考にして(PHP)、思っていたことが実現できたのですが、1つ問題が発生しました。 ダウンロードしたjpegファイルが、「Windows画像とFAXビューア」で「プレビューできません」となってしまいます。 原因にお心当たりがあればご教示いただけると助かります。 ・photoshopでは問題なく開けました。 ・上記スクリプトを使わずにファイルを右クリックで保存した場合は問題なく画像がプレビューできます。 ・ファイルを右クリックで保存した場合の方が、ファイルサイズが微妙に小さくなります。 現在、以下のように書いております。 $file_length = filesize($file); header("Content-Type: image/jpeg"); header("Content-Disposition: attachment; filename=".basename($file)); header("Content-Length:$file_length"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: private"); readfile ($file);

  • sr-ki
  • お礼率68% (43/63)
  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

とりあえず、原因が分かっておりませんので、下手な鉄砲数打ちゃ当たる的な回答をしているという前提でお聞きください。 これで、解決するとも思えないのですが、とりあえず、試してみてください。という程度な発想です。 $type = mime_content_type($file); ← 追加 $file_length = filesize($file); header("Content-Type: {$type}"); ← 一部変更 header("Content-Disposition: attachment; filename=".basename($file)); header("Content-Length:$file_length"); readfile ($file); 「Windows画像とFAXビューア」が、ファイルのどこを見て判断してNGとしてるのか分かってませんので、正直 俺には これ以上はお手上げです。 photoshopは、多分 そこらへんは 結構 アバウトに何通りかのパターンを試して表示してくれてるんだと思います。 OKなのとNGなのを、バイナリで見比べてみると、多分 何か違いが見つかるとは思います。 ↓比較もできるバイナリエディタ http://www.vector.co.jp/soft/win95/util/se079072.html

sr-ki
質問者

お礼

再度のご回答本当にありがとうございます。 最後の「バイナリで見比べてみる」というのを見て、とりあえずダメな画像をテキストエディタで開いてみたところ、一番上に以下のPHPエラーが入っていました。これが原因だったようです。 <br /> <b>Warning</b>: filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for http://-----/---.jpg in <b>/virtual/-----/------/download.php</b> on line <b>6</b><br /> なぜfilesize()がダメなのかはわからないのですが、その行をコメントアウトしたら正常になりました。

その他の回答 (2)

回答No.3

念のため、確認ですが、 ・Content-Lengthの行を消したらどうなりますか? →取得しているファイルサイズが若干違っている可能性を考慮してみる。 ・その記述の下に、半角改行だとか何かしら不正なものが含まれてたりしませんか →<?php //という囲いがあった場合に、 ?> <!--ここらへんにゴミがあったりする場合がないか--> 一番いいのは、一番最後の「?>」を消すことです。 <?php という先頭のタグだけあれば、PHPは正常に動作するので。 ・それでもダメなら、readfileを変えてみる <?php echo file_get_contents($file); ?> に変えても同じ動作をするのか。 とか。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

> ・ファイルを右クリックで保存した場合の方が、ファイルサイズが微妙に小さくなります。 とりあえず、俺なら 以下の三行をカットしてみて、どうなるか試してみます。 header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: private");

sr-ki
質問者

お礼

ご指摘の行をカットしてみましたが、同じ結果でした。 他にもいろいろ試してみます。 ご回答ありがとうございました。

関連するQ&A

  • 画像をダウンロードさせたい。

    いろいろなファイルがサーバーにあがっているとして、 その一覧が<a href="">ファイル名</a>で表示されているとします。 ファイル名を押下した時にダウンロードさせたいと思っています。 -------------------------------------------------- header("Content-Disposition: inline; filename=".$fileDlName); header("Content-Length: ".$fileDlSize); header("Content-Type: application/octet-stream"); readfile($filePath) ------------------------------------------------- ↑でCSV,PDF,ZIPファイルなどはダウンロードできるようになりました。 が、JPEG,GIF,PNGなどはブラウザに表示されてしまい ダウンロードできません。 画像も強制でダウンロードさせたいのですがよい方法はありますか?? ブラウザ:IE7 PHP:5.2.3 Apache:2.0.59 以上、よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • 動画をダウンロードするとサイズ0で終了する

    動画をダウンロードするとサイズ0となってしまいます。   動画:AVI、サイズ:122MB プログラムは <?php $file = "".$_GET["id"].".avi"; $file_length = filesize($file); header("Content-Disposition: attachment; filename=$file"); header("Content-Length: $file_length"); header("Content-Type: application/octet-stream"); readfile ($file); ?> で、ファイル名は正常に受け渡されています。 また、サイズも表示させたとこころ正常値でした。 ちなみに、サイズ19MBのAVIで試したところ、正常にダウンロード できました。 サイズの問題だと思うのですが、対応方法をお教え下さい。 宜しくお願い致します。

    • 締切済み
    • 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でDBに接続してテーブルのバックアップを取るプログラム(ファイルのダウンロード)を作成していますが、 上手く動作しません。 bktbl.phpにアクセスすると、HTML部分まで「test.csv」として保存されてしまいます。 何故なのでしょうか。。 どなたか教えて下さい。よろしくお願いします。 (プログラム内で間違ってる部分もあれば・・教えて頂きたく) 逆に、バックアップしたファイルをインポートする場合は、pg_copy_fromでいけますよね? bktbl.php <?php //DB接続処理 ・・・・   ・・・・ $rows = pg_copy_to($connection,"テーブル名");; //DB切断処理 ・・・・   ・・・・ $file = implode("\r\n", $rows); $file_size = strlen($file); header("Content-type: application/x-csv"); header("Content-Disposition: inline; filename=test.csv"); header("Content-Length: $file_size"); print $file; ?> <HTML> HTML記述部分 </HTML>

    • ベストアンサー
    • PHP
  • PHPでファイルのダウンロードすると開けません。

    PHPでファイルのダウンロードすると開けません。 文書を整理するために、アップロードして、必要に応じてダウンロードする仕組みを作っています。 PDFや画像のファイルは問題ないのですが、、 word文書(エクセルもダメでした)を、以下のファイルを作って、ダウンロードし開こうとすると 「ファイル******.docxは無いように問題があるため、開けませんでした。」となります。 ※エクセルでは、「Exelで****.xlsxを開くことが出来ません。ファイル形式またはファイルか拡張子が正しくありません。ファイル拡張子とファイル形式が一致していることを確認してください」  とダイアログが出てきます。 $file="アップロードしてある実ファイル名"; $file_name="ローカルに保存する際のファイル名"; ※ファイル名を変更しなくても同じなので、そこは関係ないと思います。 header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=$file_name"); header('Content-Length: '.filesize('$file')); readfile($file); リンクを張って開くのには何の問題もありません。 <a href="http://www.******.com/images/$file">$file_name</a> ダウンロードする際に名前を変更したいので、ダウンロード用のファイルを作ってダウンロードさせようとしています。 何か、ダウンロードをする前に処理が必要なのでしょうか? よろしくご教授お願いいたします。 ※ワード、エクセルは2010を使用しています。

    • ベストアンサー
    • PHP
  • IE6でダウンロードさせたい【PHP】

    IE6でダウンロードさせたい【PHP】 現在、PHPからのヘッダ出力を使って ファイルダウンロードさせるプログラムを作成しています。 (PHPスクリプトが呼ばれると、 ダウンロードダイアログが出現する) FireFoxでは問題なく動作するのですが、 IE6だと動作しません。(ダイアログが出ない) ※ちなみに、SSLは使ってません。 --↓ソース------------------- header("Content-Disposition: inline; filename=\"".basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Type: application/octet-stream"); readfile($path_file) ---------------------------------- -IE6のHTTPヘッダ(デバッガで抽出)-- HTTP/1.1 200 OK Date: Thu, 20 May 2010 07:35:19 GMT Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 X-Powered-By: PHP/5.2.9 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Disposition: inline; filename="20100520_133719_irai_1.txt" Content-Length: 2415 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: application/octet-stream ---------------------------------- どなたか解決策に心当たりのある方、ご教授宜しくお願いします!

    • ベストアンサー
    • PHP
  • 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
  • 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
  • サーバにあるエクセルファイルをダウンロード

    サーバ内にあるエクセルファイルをダウンロード画面からsubmitして、ダウンロードしたいのですが、ダウンロードしたファイルの内容が文字化けします。またなぜかダウンロード画面のhtml内容が張り付いてたりします。 XML形式で保存したエクセルファイルは問題なく保存→表示できるのですがどうしたらいいのか原因がわかりません。 ダウンロードのソースは、以下のようになっています。 <?php $out_path = mb_convert_encoding($file_path,"SJIS","UTF-8"); $out_file_name = basename($out_path); $file_size = filesize($out_path); header("Content-Type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"" .     $out_file_name . "\""); header("Content-Length: ".$file_size); readfile($out_path); ?> ちなみに環境は以下のようになっています。 OS :XP 文字コード:UTF-8 framework :symfony 原因をご存知の方、ご教授よろしく御願いします。

    • 締切済み
    • 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

専門家に質問してみよう