0

私はファイルパスを隠すためにphpでいくつかのファイルをダウンロードしようとしていますが、いくつかのファイルタイプは常に壊れています。pdfやmp3のようなファイルタイプはうまく機能します。doc、ppt、jpgなどのファイルタイプは常にダウンロードが壊れています。

私はこれらのmimetypesを使用します

if (file_exists($file_real)){ 
$extension = strtolower(substr(strrchr($file, "."), 1)); 
switch($extension){ 
case "ppt": $type = "application/vnd.ms-powerpoint"; break; 
case "pdf": $type = "application/pdf"; break; //------ok
case "doc": $type = "application/msword"; break; 
case "mp3": $type = "audio/mpeg"; break;//------ok
case "jpg": $type = "image/jpg"; break;  
default: $type = "application/force-download"; break; 
} 

およびこれらのヘッダー

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public", false); 
header("Content-Description: File Transfer"); 
header("Content-Type: " . $type); 
header("Accept-Ranges: bytes"); 
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($file_real));
if ($stream = fopen($file_real, 'rb')){
            while(!feof($stream) && connection_status() == 0){
                set_time_limit(0);
                print(fread($stream,1024*8));
                flush();
            }
            fclose($stream);
        }
4

1 に答える 1

1

私の推測では、PHP コードで空白文字を出力していると思います。おそらく改行。これは、PHP を介してバイナリ ファイルを提供する場合のファイル破損の非常に一般的な原因であり、特定するのが難しい場合があります。また、一部のファイル タイプは余分な空白に対処できるため、一部のファイル タイプが破損していて、他のファイル タイプが破損していない場合も非常に一般的です。

<?phpソース コードのおよび?>マーカーの外側にライン フィードを挿入するだけで、空白が PHP プログラムに非常に簡単に侵入する可能性があります。

PHP プログラム (およびすべてのインクルード) をチェックして、プログラムの最後の終了後に末尾に空白行がないことを確認してください?>。マーカーの前のファイルの先頭もチェックします<?phpが、プログラムの最後の空白行の方がはるかに一般的です。

実際には、?>エンド マーカーを完全に削除することをお勧めします。これはオプションであり、削除すると、PHP ファイルの末尾に空白の問題がまったく発生しなくなります。

それが役立つことを願っています。

于 2012-06-02T21:04:54.183 に答える