ファイルのダウンロードについて

このQ&Aのポイント
  • ファイルのダウンロードについて質問です。headerを使用してファイルをダウンロードしていますが、エクセルやワードのファイルを開く際にエラーメッセージが表示され、文字化けすることがあります。ダウンロードするファイル名を変更できる方法や、エラーを解決する方法があれば教えてください。
  • ファイルのダウンロード方法に関する質問です。headerを使ってファイルをダウンロードしていますが、エクセルやワードのファイルを開く際にエラーメッセージが表示されることがあります。ファイル名を変更できる方法や、エラーを解決する方法がありましたら教えてください。
  • ファイルのダウンロード時に起こるエラーや文字化けの問題について質問です。headerを使用してファイルをダウンロードしていますが、エクセルやワードのファイルを開く際に問題が発生します。ファイル名を変更できる方法や、エラーを解決する方法があれば教えてください。
回答を見る
  • ベストアンサー

ファイルのダウンロードについて

いつもお世話になっております。 ファイルのダウンロードについて質問です。    header('Content-Type: image/jpeg'); header('Content-Length: '.filesize($fpath)); header('Content-disposition: attachment; filename="'.$fname.'"'); readfile($fpath); headerを使っています。 ダウンロードしたいファイルは jpg,pdf,xls,xlsx,doc,ppt,などですが それぞれ Content-Type は 拡張子 xlsなら  header('Content-Type: application/vnd.ms-excel'); にと 変更しております。 エクセルを ダウンロードしますと、 「開こうとしているファイルは実際にはその拡張子が示すファイル形式ではありません。 このファイルを開く前にファイルが破損していないこと、信頼できる発行元からの ファイルであることを確認してください。ファイルを今すぐ開きますか?」 とメッセージが出てきて、「はい」とすると 文字化けしたエクセルが開きます。 ワードですと、開いて修復しますかとエラーが出た後 ⇒OK⇒ 正しく開けます。 PDFだと 問題なく開きます。 エクセルとワードは 下記のように書きますと <a href='files/ファイル名' target='_blank'> 正しく開くことができますが、この方法だと ダウンロードするファイル名を 変更できませんので、使うことができません。 上記のエラー解決方法はありますでしょうか。 また header 以外の方法で ファイル名を変更して ダウンロードする方法が ありましたら 教えていただけませんでしょうか。 情報不足でしたらすみません。 よろしくお願いいたします。

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

header以降の記述は問題ないと思います(こちらで試しても問題ありません)。 headerより前に何かブラウザに返していませんか?<?phpより前に空白1バイトでもあればそれが送信されてしまいます。こちらで<?phpの前にasciiの空白をひとつ挿入したところExcelは化けて、pdfは問題なく開くという提示されたのと同様な現象になりました。

maki_peko
質問者

お礼

いつもありがとうございます。 教えていただいたことを確認するために よけいなものは すべて外して ファイル名もデータベースから引っ張るのではなく ファイル名を直接記入し 単純にダウンロードのみの コードにしてみて、実行しましたが 状態は同じでした。 ネットでさらに調べてみましたら 読み込む前に header("Connection: close"); ob_end_clean(); この2行を追加すればよいとありましたので やってみましたら、 これで解決しました。 全然意味はわかりませんが とりあえず解決できました。 ありがとうございました。

関連するQ&A

  • 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
  • excelファイルのダウンロード

    サーバーに配置してある、excelファイルをダウンロードさせ、 ダウンロードしたファイルを開こうとすると 「開こうとしているファイル 'xxxxxxxx' の形式は、ファイル拡張子が示す形式と異なります。 このファイルを開く前に、ファイルが破損していないこと、信頼できる発行元からのファイルであることを確認してください。 ファイルを今する開きますか? 」 というポップアップが表示され、「はい」をクリックして表示すると文字化けしています。 ソースは以下のように書いています。 どこが問題なのか、教えていただければと思います。 よろしくお願いします。 $file = excelファイルのフルパス header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=sample.xls'); header('Content-Transfer-Encoding: binary'); header('Content-Length:' . filesize($file)); header('Pragma: no-cache'); header('Cache-Control: no-cache'); readfile($file);

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

    PHPで複数のログファイルをダウンロードしたいときはどのようにしたらよいのでしょうか? ログファイルは下記のような形式です。 test_20041001,test_20041002,・・・,test_2004_1031 以前までは、DBから取得したデータをタブ区切りで表示したものを .xlsファイルでダウンロードしていました。 そのときのやり方としては、 //---------------------------------- //ファイルダウンロード //---------------------------------- $fSize = $Sec->getFileSize(ADMIN_RESERVECSV_PATH); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . PATH); header("Content-Length: " . $fSize['B']); readfile(PATH); というような方法です。

    • 締切済み
    • PHP
  • PHPでWAVファイルをDL→保存する

    PHPでWAVファイルをダウンロード→保存できるようにしたいと思い 以下のプログラムを組みました。 $fpath = 'wav/music.wav'; // ファイルパス $fname = 'music.wav'; // ファイル名 header('Content-Type: audio/x-wav'); header('Content-Length: '.filesize($fpath)); header('Content-Disposition: attachment; filename="'.$fname.'"'); echo file_get_contents($fpath); ファイルのダウンロード、保存と出来たのですが 実際にファイルを開こうとすると音楽プレーヤーで再生出来ませんでした。 ダウンロードしたファイルと元のファイルのプロパティを見比べた所、 「概要」に表示されていた項目(ビットレート等)が消えていたので 正常に保存が出来ていないようです。ファイルサイズは同じでした。 どうすればWAVファイルが普通に保存できるでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでファイルをダウンロードさせるコード

    PDFファイルをその場では開かせず、ダウンロードさせるコードを作成しています header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($path_file) . '"'); header('Content-Length:' . $content_length); ファイルをダウンロードさせること自体は成功しており、ファイル容量も間違ってないのですが ダウンロード後に開こうとするとファイルが破損していて開くことができません。 また、ハイパーリンクから直接開かせた場合は問題なく表示できております。 原因の分かる方がいらっしゃいましたらアドバイスお願い致します。

    • ベストアンサー
    • PHP
  • 画像をダウンロードさせたい。

    いろいろなファイルがサーバーにあがっているとして、 その一覧が<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
  • 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
  • ファイルのダウンロードが出来ない

    こんばんは。お世話になっております。 CSVファイルをダウンロードさせるスクリプトを作成したのですが、そのスクリプト(ファイル)を、さくらインターネットのサーバへアップすると「ダウンロードせずにブラウザに表示されるだけ」という状態になってしまいます。(ローカル上や別サーバでは問題ない) ファイル上に記述する、Headerですが、サイトによっていくつかの記述方法があったので、以下のように2種類のHeaderを試していますが、共に「さくらインターネットだけがダウンロードしない」状況です。 ファイルをダウンロードさせるスクリプトは、今回初めて作ってみたのですが、他にどのような対処法があるのかが分かりません。考えられる可能性だけでも結構ですので、アドバイスいただけると幸いです。 //Header("Content-type:application/x-csv;"); //header("Content-Disposition: inline; filename=$fname.csv"); header("Content-Type: application/octet-stream;"); header("Content-Disposition: attachment; filename=$fname.csv"); 以上、お忙しい中恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでのファイルダウンロードについて

    初めて質問させていただきます。 社内用でファイルのアップロード・ダウンロードができるシステムを開発しています。 PCからは問題なくアップロードもダウンロードも行えていたのですが、 スマホからアクセスしてダウンロードをすると失敗してしまいます。 下記のコードを使ってます。 ファイルの種類はいろいろなので、「application/octet-stream」にしてます。 が、それぞれのファイルタイプに合わせて変更させても状況は変わりませんでした。 -- header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Content-Length: '.filesize($dl_file)); readfile($dl_file); exit; -- なにか解決策があるようでしたら、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルをダウンロードしたい

    PHPでDBから取ってきたデータをエクセルに出力し、ダウンロードさせる プログラムを書いていますが、うまくいきません。 処理の流れは以下のようになっています。 ----------------------------------------------------- ◇top.php(ダウンロードボタン押下) ↓ ◇action.php実行 さらにこの中で、 ・logic.php実行→DBからデータ取得 ・excel.php実行(ダウンロードボタン押下時のみ) logicからデータをもらってエクセルファイル生成。 header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"$filename\""); ・view.php実行→Smartyでtop.phpの画面表示(top.tpl) (logicからviewに値を渡してデータを画面表示) ----------------------------------------------------- この処理だと、ダウンロードされるファイルが生成したものでなく、 top.phpをダウンロードしてしまうんです。(中身はHTMLですけど。) 同じような質問がありましたが、結局どうしたらいいのか・・ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1432459 top.phpにはデータを表示していて、ダウンロードボタンも付いている って感じです。ボタンを押した時の挙動をどうしたらいいのか、いまいち 分かりません。 よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう