1

I have gotten a problem about downloading .jpg and .avi files from a server using PHP I have the following code:

$fileName = "Koala.jpg";
$filePath = "./Koala.jpg";
if (!file_exists($filePath)){
    echo "No file";
    return;
}
$fp = fopen($filePath, "r");
$fileSize = filesize($filePath);
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Length: $fileSize");
header("Content-Disposition: attachment;filename=".$fileName);

$buffer = 1024;
while(!feof($fp)){
    $data = fread($fp, $fileSize);
    echo $data;
}
fclose($fp);

The code downloads .txt file successfully and the downloaded file can be read. However, when it comes to .jpg, the downloaded .jpg file cannot be read. Can anyone give a helping hand? Thanks

Have just tried another method and it works fine

$file = 'Koala.jpg';

if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}

But just wonder what reason causes the first method fail, even though using fopen("xxx", "rb") instead. Thank you

4

4 に答える 4

0

image/jpeg の application/octet-stream を置き換えてみてください。

よろしく

于 2012-07-25T10:08:26.873 に答える
0

私は php の専門家ではありませんが (申し訳ありませんが)、Windows サーバーで php を使用するときに同様の問題が発生したことを覚えています。fopen($filePath, "rb");これは、バイナリ フラグを指定せずにファイルを開いたことが原因でした (サンプルにあるはずです)。そのフラグを設定しないと、ストリームから読み取るときにデータが変更される可能性があり、ファイルが破損する可能性があります (テキストファイルでは気付かないでしょう)。

利用可能なさまざまなモードの詳細については、http://www.php.net/manual/en/function.fopen.phpを参照してください。

于 2012-07-25T10:15:19.533 に答える
0

これを使ってみてください --

<?php
$filename = "MyImage.jpg";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
于 2012-07-25T10:17:49.907 に答える
0

使用している次のコードの代わりに、

$buffer = 1024;
while(!feof($fp)){
    $data = fread($fp, $fileSize);
    echo $data;
}

readfileメソッドを使うだけ

readfile($filePath);
于 2012-07-25T10:34:42.440 に答える