2011-02-24 11 views
0

PHPを使用してContent-Dispositionを「添付ファイル」に設定してファイルを送信すると、ファイルのダウンロードが途切れるサイトに問題がありますreadfile()を使用してください。 PHPのreadfile()マニュアルページで議論がたくさんあるので、これは幾分悪名高い問題だと私は知っています。私はそこに投稿された各ソリューションを運がない(チャンクされた出力を送信し、Apache/PHPの両方でgzip圧縮を無効にして)試みました。ここではそのコードの要旨はあなたがPHPマニュアルでそれを見つけるだろうと同じように、すべての回避策なしに、次のとおりです。最も重要なのはApache mod_headerを使用した動的ファイル名とContent-Dispositionを使用したファイルのダウンロード

$file = '/path/to/ugly.file.name.mp4'; 
$filename = 'ANiceFileName.mp4'; 
header('Content-Description: File Transfer'); 
header('Content-Type: video/mp4'); 
header('Content-Disposition: attachment; filename='.$filename.'.mp4'); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

、私は動的なファイル名を送信できるようにしたいと思い予告私はディスクにファイルを格納するために使用するより機械フレンドリなコードを避けるために、そして、はい、コードのこのビットが実行される前に私はたくさんのセキュリティチェックを行いました - 私はすでにreadfile()がセキュリティ上の欠陥になる可能性があることを知っています。 :-)

私が完全なファイルを送信するために見つけた唯一の信頼できる方法は、単にPHPをゴミ箱に入れ、代わりにApacheのmod_headerを使用してファイルをダウンロードします。これと同じように:

<FilesMatch "\.mp4$"> 
    ForceType application/octet-stream 
    Header set Content-Disposition attachment 
</FilesMatch> 

これは非常にうまく機能しませんが、大きな問題があります - 私はもはや私のコンテンツにやや重要である、要求に応じて動的なファイル名を生成することができます。私はすでに;filename=file_name.mp4を指定していることを知っていますが、覚えておいてください。file_name.mp4ではなく動的名を指定する必要があります。

ファイルを送信するときに、何らかの形でApacheに(PHPを使用して)動的ファイル名を通知できると本当にうれしいです。それは可能ですか?あるいは、ディスク上のすべてのファイルの名前をユーザーフレンドリーな名前に変更するように強制されますか? PHPのソリューションはまったく動作しません。私のファイルは15MBまでであることもあり、転送すると2MB未満に切り捨てられることがあります。おお!

Help Over Stack Flow Kenobi!あなたは私の唯一の希望です。

答えて

0

hereのようにmod_xsendfileを試してください。これは基本的に、PHPがX-Sendfileヘッダを設定する時点でPHPがHTTP会話の途中から抜け出すことを可能にしますが、そのブログで見られるように、Content-Dispositionヘッダを設定することができます。

+0

非常に申し訳ありません。私のウェブホストを数週間扱った後、ついにmod_xsendfileがインストールされました。それは素晴らしい作品です。ありがとう! – crab

0

が出てPHPスクリプト回ので、それが切り捨てられてきていますか? set_time_limit?