[PHP-users 29144] PDF ・ MS Office ファイルなどをダウンロードする方法

小山 憲一 puyoumailaddress @ yahoo.co.jp
2006年 5月 8日 (月) 17:12:40 JST


PHPで開発をしているこやまです。

ドキュメントルート配下でないファイル(PDFやMS Officeなど)を
ダウンロードできるページを作成しています。
作成したページを実行すると、「ブランク画面が表示される」または
「PDFファイルの場合はHTMLとして表示される」問題で困っています。
原因または解決策をご存知の方はいらっしゃいませんか。

私の行った手順は以下です。
(1)PHPでファイルをダウンロードする方法を検索
   1. PEAR::HTTP_Download を使用する
   2. header関数を使用する
(2)「1.」と「2.」両方でページを作成
ダウンロードするファイルは、静的なものなのでファイルパス、
ファイル名は直接記述しています。
----- hoge1.php ここから
require_once 'HTTP/Download.php';

  $objDl = new HTTP_Download();
  $objDl->setContentType('application/octet-stream');
  $objDl->setFile('/var/www-ssl/doc/test.pdf');
  $objDl->setContentDisposition(HTTP_DOWNLOAD_ATTACHMENT, 'test.pdf');
  $objDl->send();
----- ここまで
----- hoge2.php ここから
  $fname = 'test.pdf';
  $path_file = '/var/www-ssl/doc/' . $fname;
  /* ファイルの存在確認 */
  if( !file_exists( $path_file )){
    die("Error: File does not exist.");
  }
  /* オープンできるか確認 */
  if( !($fp = fopen( $path_file, "r" ))){
    die("Error: Cannot open the file(".$path_file.")");
  }
  fclose($fp);
  /* ファイルサイズの確認 */
  if(( $content_length = filesize( $path_file )) == 0 ){
    die("Error: File size is 0.");
  }
  /* ダウンロード用のHTTPヘッダ送信 */
  header("Content-Type: application/octet-stream");
  header("Content-Disposition: attachment; filename={$fname}" );
  header("Content-Length: " . $content_length);
  
  /* ファイルを読んで出力 */
  if( !readfile( $path_file )){
    die("Cannot read the file(".$path_file.")");
  }
----- ここまで
(3)
   <a.href=hoge1.php>ダウンロード</a>
   <a.href=hoge2.php>ダウンロード</a>
   リンクを作成してクリックする。
   または
   ttp://server.url/hoge1.php
   ttp://server.url/hoge2.php
   直接URLを指定する

すると、以下のような結果になりました。
  hoge1.phpの場合
  空白のページを表示。
  [ファイル]-[プロパティ]で種類 = 使用不可
  ソースを開くと空です。
  
  hoge2.phpの場合
  PDFファイルをHTMLとして表示する
  [ファイル]-[プロパティ]で種類 = HTML Document
  「%PDF-1.4 1 0 obj・・・」と表示
  [ファイル]-[名前をつけて保存]でテキストファイル、hoge2.pdfとして
  デスクトップに保存して、開くとPDFファイルとして開くことができる。

私は「ダウンロード・ダイアログが開く」または「ブラウザ内でPDFが
開かれる」と思っていました。やりたいは、「ダウンロード・ダイアログが
開く」ことです。

原因を確かめるため、検索エンジンやPHP メーリングリストで
「PDF、ファイル、ダウンロード」で検索して、以下のようなテストを
行ってみましたが、解決には至りませんでした。

(a) PDFファイルをドキュメントルート配下に設置
→上記と同じ結果になった

(b) hoge2.phpで「Content-Type」と「Content-Disposition」を
    変更
→上記と同じ結果になった
  Content-Type: application/x-download
  Content-Type: application/force-download
  Content-Type: application/pdf
  Content-Disposition: inline; filename={$fname}

なお、私の環境は以下の通りです。
サーバ:CentOS 4.2
        PHP 4.3.9
        APACHE 2.0.52
        PEAR PEAR 1.4.9 
             HTTP_Download 1.1.1

クライアント:WinXP SP2
              IE6.0 SP2


--
こやま
puyoumailaddress @ yahoo.co.jp


PHP-users メーリングリストの案内