6

オンライン ストアから .dmg を提供できません。デバッグのためにコードを次のように削除しましたが、何を取得してもゼロバイトのファイルが提供されます。

header('Content-Type: application/x-apple-diskimage');   // also tried octet-stream
header('Content-Disposition: attachment; filename="My Cool Image.dmg"');
$size = filesize('/var/www/mypath/My Cool Image.dmg');
header('Content-Length: '.$size);
readfile('/var/www/mypath/My Cool Image.dmg');

この同じコードは、bin、zip、pdf など、私が提供する他の多くのファイル タイプでも機能します。助言がありますか?グーグル教授は私の友達ではありません。

4

2 に答える 2

4

解決策を見つけました。原因はreadfile()であり、メモリに関連している可能性があります。readfile()行の代わりに、これを使用しています。

$fd = fopen ('/var/www/mypath/My Cool Image.dmg', "r");
while(!feof($fd)) {
    set_time_limit(30);
    echo fread($fd, 4096);
    flush();
}
fclose ($fd);

これで、DMGを含め、すべてのファイルタイプが適切に提供されるようになりました。

于 2012-04-26T18:22:38.320 に答える
1

ファイル名にスペースを含めないでください (Web でホストされているファイルに関しては、スペースを使用しないでください)。

このようなことを試すか、ファイルの名前をスペースなしで変更してください:

<?php 
$path ='/var/www/mypath/';
$filename = 'My Cool Image.dmg';

$outfile = preg_replace('/[^a-zA-Z0-9.-]/s', '_', $filename);

header('Content-Type: application/x-apple-diskimage');   // also tried octet-stream
header('Content-Disposition: attachment; filename="'.$outfile.'"');

header('Content-Length: '.sprintf("%u", filesize($file)));

readfile($path.$filename); //This part is using the real name with spaces so it still may not work
?>
于 2012-04-26T04:37:29.713 に答える