php 下载脚本错误
php download script error
我用这个功能来下载link:
<?php
function downloadFile($fileLocation,$fileName,$maxSpeed = 13,$doStream =
false){
if (connection_status()!=0) return(false);
$extension = strtolower(end(explode('.',$fileName)));
/* List of File Types */
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['rar'] = 'application/rar';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'video/x-msvideo';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
$contentType = $fileTypes[$extension];
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary\n");
header("Content-Type: $contentType");
$contentDisposition = 'attachment';
if($doStream == true){
/* extensions to stream */
$array_listen = array('mp3','m3u','m4a','mid','ogg','ra','ram','wm',
'wav','wma','aac','3gp','avi','mov','mp4','mpeg','mpg','swf','wmv','divx','asf');
if(in_array($extension,$array_listen)){
$contentDisposition = 'inline';
}
}
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$fileName= preg_replace('/\./', '%2e', $fileName,
substr_count($fileName, '.') - 1);
header("Content-Disposition: $contentDisposition; filename=".$fileName);
} else {
header("Content-Disposition: $contentDisposition; filename=".$fileName);
}
header("Accept-Ranges: bytes");
$range = 0;
$size = filesize($fileLocation);
if(isset($_SERVER['HTTP_RANGE'])) {
list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2=$size-1;
$new_length=$size-$range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2=$size-1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: ".$size);
}
if ($size == 0 ) { die('Zero byte file! Aborting download');}
set_magic_quotes_runtime(0);
$fp=fopen("$fileLocation","rb");
fseek($fp,$range);
while(!feof($fp) and (connection_status()==0))
{
set_time_limit(0);
print(fread($fp,1024*$maxSpeed));
flush();
ob_flush();
sleep(1);
}
fclose($fp);
return((connection_status()==0) and !connection_aborted());
}
/* Implementation */
$filename="shopfile.zip";
$location="file/";
downloadFile($location,$filename,900,false);
?>
但是当 运行 时出现此错误:
严格标准:在第 16
行的 /home/behzadfar/public_html/shopfile/download.php 中,仅应通过引用传递变量
警告:无法修改 header 信息 - headers 已经在 /home/behzadfar/public_html/shopfile/download 中发送(输出开始于 /home/behzadfar/public_html/shopfile/download。php:16)。 php 第 57 行
我该如何解决?
解决问题:
您必须将实际变量传递给 end()
,而不是返回数组的函数。所以:
$pieces = explode('.',$fileName);
$extension = strtolower(end($pieces));
这在 end
的 PHP's manual 中有解释。
节选
This array is passed by reference because it is modified by the function. This means you must pass it a real variable and not a function returning an array because only actual variables may be passed by reference.
没有中间变量的解
如果您不想使用中间变量,请使用 array_pop
而不是 end
:
$extension = strtolower(array_pop(explode('.',$fileName)));
出现与 headers 相关的错误已经发送,因为 PHP 已经必须在页面(已交付的内容)上向您显示错误,因此它阻止了自己修改headers(一旦开始传送内容,您就无法修改 HTTP headers)。修复 strict standards 错误将修复 header 错误。
错误来自这一行:
$extension = strtolower(end(explode('.',$fileName)));
end()
的参数通过引用传递(参见manual:mixed end ( array &$array )
因此您必须将代码更改为:
$array = explode('.',$fileName);
$extension = strtolower(end($array));
另请查看 pathinfo()
,这将是一个更简洁的解决方案:
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
如果它已经是标准 php 函数的一部分,为什么要自己实现这个函数。
你为什么不用 http://php.net/manual/en/function.finfo-file.php 替换那个数组:
$finfo = new finfo(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
$contentType = $finfo->file($fileLocation.$filename) ;
您的脚本是以 4 开头还是以任何空格开头??
我用这个功能来下载link:
<?php
function downloadFile($fileLocation,$fileName,$maxSpeed = 13,$doStream =
false){
if (connection_status()!=0) return(false);
$extension = strtolower(end(explode('.',$fileName)));
/* List of File Types */
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['rar'] = 'application/rar';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'video/x-msvideo';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
$contentType = $fileTypes[$extension];
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary\n");
header("Content-Type: $contentType");
$contentDisposition = 'attachment';
if($doStream == true){
/* extensions to stream */
$array_listen = array('mp3','m3u','m4a','mid','ogg','ra','ram','wm',
'wav','wma','aac','3gp','avi','mov','mp4','mpeg','mpg','swf','wmv','divx','asf');
if(in_array($extension,$array_listen)){
$contentDisposition = 'inline';
}
}
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$fileName= preg_replace('/\./', '%2e', $fileName,
substr_count($fileName, '.') - 1);
header("Content-Disposition: $contentDisposition; filename=".$fileName);
} else {
header("Content-Disposition: $contentDisposition; filename=".$fileName);
}
header("Accept-Ranges: bytes");
$range = 0;
$size = filesize($fileLocation);
if(isset($_SERVER['HTTP_RANGE'])) {
list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2=$size-1;
$new_length=$size-$range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2=$size-1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: ".$size);
}
if ($size == 0 ) { die('Zero byte file! Aborting download');}
set_magic_quotes_runtime(0);
$fp=fopen("$fileLocation","rb");
fseek($fp,$range);
while(!feof($fp) and (connection_status()==0))
{
set_time_limit(0);
print(fread($fp,1024*$maxSpeed));
flush();
ob_flush();
sleep(1);
}
fclose($fp);
return((connection_status()==0) and !connection_aborted());
}
/* Implementation */
$filename="shopfile.zip";
$location="file/";
downloadFile($location,$filename,900,false);
?>
但是当 运行 时出现此错误: 严格标准:在第 16
行的 /home/behzadfar/public_html/shopfile/download.php 中,仅应通过引用传递变量警告:无法修改 header 信息 - headers 已经在 /home/behzadfar/public_html/shopfile/download 中发送(输出开始于 /home/behzadfar/public_html/shopfile/download。php:16)。 php 第 57 行
我该如何解决?
解决问题:
您必须将实际变量传递给 end()
,而不是返回数组的函数。所以:
$pieces = explode('.',$fileName);
$extension = strtolower(end($pieces));
这在 end
的 PHP's manual 中有解释。
节选
This array is passed by reference because it is modified by the function. This means you must pass it a real variable and not a function returning an array because only actual variables may be passed by reference.
没有中间变量的解
如果您不想使用中间变量,请使用 array_pop
而不是 end
:
$extension = strtolower(array_pop(explode('.',$fileName)));
出现与 headers 相关的错误已经发送,因为 PHP 已经必须在页面(已交付的内容)上向您显示错误,因此它阻止了自己修改headers(一旦开始传送内容,您就无法修改 HTTP headers)。修复 strict standards 错误将修复 header 错误。
错误来自这一行:
$extension = strtolower(end(explode('.',$fileName)));
end()
的参数通过引用传递(参见manual:mixed end ( array &$array )
因此您必须将代码更改为:
$array = explode('.',$fileName);
$extension = strtolower(end($array));
另请查看 pathinfo()
,这将是一个更简洁的解决方案:
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
如果它已经是标准 php 函数的一部分,为什么要自己实现这个函数。
你为什么不用 http://php.net/manual/en/function.finfo-file.php 替换那个数组:
$finfo = new finfo(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
$contentType = $finfo->file($fileLocation.$filename) ;
您的脚本是以 4 开头还是以任何空格开头??