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 回答