PHPでファイルをダウンロードする方法とよくあるエラー

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PHPでheader()を使ったファイルのダウンロード方法をご紹介します。

ファイル形式と、ファイルサイズの取得、ファイルのリネームの3つを行い、ファイルを読み込むだけで簡単にダウンロード可能です。

よくあるファイルダウンロード時のエラーも紹介しています。

 

ファイルをダウンロードする

基本的なダウンロード方法

上記コードを記述したファイルにアクセスすると、即ダウンロードが始まります。

※firefoxなど一部のブラウザでは確認ダイアログが出ます。

readfile()の部分はファイルを読み込む関数であればいいのでfile_get_contents()でもいいのですが、大容量のファイルはうまく処理できないためreadfile()で読み込むと良いでしょう。

特定のファイル形式を指定してダウンロード

上記では、ファイル形式をPDFで指定しました。

ファイル形式を明確に指定すると、ダウンロードせずにブラウザに直接表示させるなど、ファイルの処理方法の選択肢が拡がります。

もっと簡単にダウンロード

一部ブラウザでは以下のような簡単なコードでもダウンロードできましたよ。

application/force-downloadContent-LengthContent-Disposition: attachmentを省略しました。

Content-Type:

PDFや画像などファイルタイプを指定します。

このapplication/force-downloadを省略してもgoogle chromeとfirefoxでは問題なくダウンロードされました。

ただ、safariなど一部のブラウザではhtmlファイルとしてダウンロードされたため、省略することで違うファイルとして誤認識されてしまいました。

Content-Length:

ファイルサイズを取得し、ダウンロードの進捗を%表示してくれます。

Content-Length:の後に、元ファイル名またはパス名を指定します。

無くてもダウンロードはされますが、ダウンロードの進捗が分からないのは不便ですね。

Content-Disposition: attachent

ファイルの処理方法を指定します。

省略するとデフォルト値であるinlineが指定されますが、これはファイルをダウンロードせずそのまま表示させる指示となります。

attachmentはダウンロードの指示です。

ただ、Content-Type: application...で指定したファイルが明確でない場合は、ダウンロードされます。

最初の基本的な使い方のサンプルは、ファイル形式を敢えてブラウザに認識させずダウンロードさせたものです。

 

バグの元にもなるので、よほど理由がない限りは省略させずに記述した方がいいかと思います。

ダウンロードせずにブラウザにそのまま表示

おまけで、ダウンロードせずにブラウザに直接表示させる方法もご紹介します。

PDFファイルを表示させる

Content-Typeに application/pdfを指定します。

テキストファイルを表示させる

Content-Typeに text/plainを指定します。

よくあるエラー

全て.php型式でダウンロードされてしまう

.pdf.txtなどの形式でも、ダウンロードするとなぜか拡張子が全て.phpに変わってしまうことがあります。

それはContent-Disposition: filenameを省略したからでしょう。

ダウンロード後のファイル名を決めるContent-Disposition: filenameは必ず指定するようにしましょう。

容量 0 の空ファイルがダウンロードされてしまう

ファイルを読み込む関数によっては、大容量のファイルを処理しきれないものがあります。

例えばfile_get_contents()はファイルを読み込む際には便利ですが、容量が大きいダウンロードには向かないでしょう。

容量が0のファイルがダウンロードされます。

容量の大きいファイルをダウンロードする際はreadfile()を使いましょう。

header関数のエラー

サンプルのコードを記述してもなぜかエラーになるという人もいるでしょう。

以下のようなエラーが多いようです。

Warning: Cannot modify header information – headers already sent by (output started at…

これはすでにヘッダーが送信されていますよというエラーです。

ヘッダー関数の前にechohtmlなど何らかの出力すると上記のようなエラーが出ます。

 

参考:header関数でのよくあるエラー

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*