0

私は自分のサイトのアップロードの多くを、保管のために RapidShare にオフロードしています。次に、ファイルをダウンロードしたいユーザーがアクセスすると、API を使用して RapidShare からファイルをダウンロードし、ユーザーに提供するスクリプトがあります。ファイルを提供するスクリプト内の関連コードは次のとおりです。

// Stream file to user
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=' . $result->name);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Content-Length: ' . $result->size);

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download';
$url .= '&login=login';
$url .= '&password=mypass';
$url .= '&fileid=' . $result->rs_fileid;
$url .= '&filename=' . $result->name;

$handle = fopen($url, 'rb');
if(!$handle) {
    throw new Exception('Failed to open file handle');
}

while(!feof($handle)) {
    echo fread($handle, 1024*1024);
    ob_flush();
    flush();
}

fclose($handle);

これは、画像を除く、テストしたすべてのファイルで正常に機能します。画像がダウンロードされると、画像が破損しています。Windows フォト ビューアーでは画像を開くことができず、Photoshop などのプログラムでも開くことができません。

奇妙なことに、.exe をダウンロードして実行すると、すべて正常に動作します。破損していません。私が知る限り、画像でのみ発生します。また、.pdf でテストしました。

さらに奇妙なことに、元の画像のファイルサイズ (2,882 バイト) と、このスクリプトでダウンロードした画像のファイルサイズを見ると、それらは同じです。両方のファイルサイズは 2,882 バイトです。しかし、画像はまだ壊れています。

これの原因と解決策は何ですか?ダウンロード時にファイルにバイナリデータを追加しているわけではありません。:/

ありがとう。

編集: 言い忘れましたが、スクリプトを使用せずに RapidShare から直接ファイルをダウンロードした場合、イメージは問題なく、破損していません。したがって、ここでスクリプトに問題があるに違いありません。

4

2 に答える 2

1

同様の問題について私の回答を確認してください。ファイルの先頭に何らかの通知があると確信しています!

于 2012-06-13T22:12:04.910 に答える
1

コードを簡素化します。必要なheader()ものはなく、file_put/get_contents ははるかに洗練されています。

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download';
$url .= '&login=login';
$url .= '&password=mypass';
$url .= '&fileid=' . $result->rs_fileid;
$url .= '&filename=' . $result->name;

file_put_contents($result->name, file_get_contents($url));

メモリに問題がある場合は、使いやすいmod_xsendfileを使用してください。

于 2012-06-13T22:16:28.480 に答える