[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 メーリングリストの案内