我将很多网站上传到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下载文件而不通过脚本,图像很好并且没有损坏。所以这里的剧本必须是错误的。
答案 0 :(得分:1)
检查我的answer for a similar problem,我很确定您的文件开头会有一些通知!
答案 1 :(得分: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,易于使用。