我正在测试this code以下载10 MB的大块文件:
/**
* Copy remote file over HTTP one small chunk at a time.
*
* @param $infile The full URL to the remote file
* @param $outfile The path where to save the file
*/
function copyfile_chunked($infile, $outfile) {
$chunksize = 10 * (1024 * 1024); // 10 Megs
/**
* parse_url breaks a part a URL into it's parts, i.e. host, path,
* query string, etc.
*/
$parts = parse_url($infile);
$i_handle = fsockopen($parts['host'], 80, $errstr, $errcode, 5);
$o_handle = fopen($outfile, 'wb');
if ($i_handle == false || $o_handle == false) {
return false;
}
if (!empty($parts['query'])) {
$parts['path'] .= '?' . $parts['query'];
}
/**
* Send the request to the server for the file
*/
$request = "GET {$parts['path']} HTTP/1.1\r\n";
$request .= "Host: {$parts['host']}\r\n";
$request .= "User-Agent: Mozilla/5.0\r\n";
$request .= "Keep-Alive: 115\r\n";
$request .= "Connection: keep-alive\r\n\r\n";
fwrite($i_handle, $request);
/**
* Now read the headers from the remote server. We'll need
* to get the content length.
*/
$headers = array();
while(!feof($i_handle)) {
$line = fgets($i_handle);
if ($line == "\r\n") break;
$headers[] = $line;
}
/**
* Look for the Content-Length header, and get the size
* of the remote file.
*/
$length = 0;
foreach($headers as $header) {
if (stripos($header, 'Content-Length:') === 0) {
$length = (int)str_replace('Content-Length: ', '', $header);
break;
}
}
/**
* Start reading in the remote file, and writing it to the
* local file one chunk at a time.
*/
$cnt = 0;
while(!feof($i_handle)) {
$buf = '';
$buf = fread($i_handle, $chunksize);
$bytes = fwrite($o_handle, $buf);
if ($bytes == false) {
return false;
}
$cnt += $bytes;
/**
* We're done reading when we've reached the conent length
*/
if ($cnt >= $length) break;
}
fclose($i_handle);
fclose($o_handle);
return $cnt;
}
我首先在小图像上测试此代码。图像被下载到我的帐户,但是以一种破坏的形式:所有字节看起来都正确exept“0D”字节从下载的图像中删除,这使其无法使用。
为什么会发生这种情况以及如何克服它?
谢谢!
答案 0 :(得分:1)
每个人都过得愉快,感谢您的帮助。
现在问题得到解决,罪魁祸首得到了解决。
我一直在读一些书,发现这个:
ftp_get()将远程服务器上的文件复制到您的计算机上。 FTP_ASCII参数将文件传输为ASCII文本。在此选项下,换行结束
从一个操作系统移动到另一个操作系统时自动转换。另一种选择
是FTP_BINARY,用于非文本文件,因此不会发生换行转换。
我的问题中提供的代码工作正常,并正确下载图像。
当我查看图像时,我正在使用由主机提供商提供的php编写的文件管理器将其下载到我的计算机。显然,他们并不擅长PHP,因为他们使用上面提到的FTP_ASCII参数来传输二进制文件。因此图像被破坏了。
当我直接从FTP帐户下载图像时,图像被证明与原始图像相同。
因此,最终问题出在PHP代码上,而不是我编译的代码。