我们一直在使用以下脚本下载照片,但现在它已不再适用。在is_file
函数中,如果它不是文件到图像所在的实际图像位置,它会重定向。如果我把它拿出来,它下载但是jpg有错误。不确定是因为图像在那里(如果不下载,你会被重定向到它)。
<?php
ini_set('memory_limit', '-1');
$sourceFile = $_GET['file'];
$sourceFile = urldecode($sourceFile);
if( headers_sent() )
die('Headers Sent');
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
if (!is_file( $sourceFile ))
header( 'Location:'. $sourceFile ) ;
$len = filesize($sourceFile);
$filename = basename($sourceFile);
$file_extension = strtolower(substr(strrchr($filename,"."),1));
switch( $file_extension ) {
case "pdf" : $ctype="application/pdf"; break;
case "exe" : $ctype="application/octet-stream"; break;
case "zip" : $ctype="application/zip"; break;
case "doc" : $ctype="application/msword"; break;
case "xls" : $ctype="application/vnd.ms-excel"; break;
case "ppt" : $ctype="application/vnd.ms-powerpoint"; break;
case ".docx": $ctype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"; break;
case ".pptx": $ctype="application/vnd.openxmlformats-officedocument.presentationml.presentation"; break;
case ".xlsx": $ctype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; break;
case "gif" : $ctype="image/gif"; break;
case "png" : $ctype="image/png"; break;
case "jpeg" :
case "jpg" : $ctype="image/jpg"; break;
case "mp3" : $ctype="audio/mpeg"; break;
case "wav" : $ctype="audio/x-wav"; break;
case "mpeg" :
case "mpg" :
case "mpe" : $ctype="video/mpeg"; break;
case "mov" : $ctype="video/quicktime"; break;
case "avi" : $ctype="video/x-msvideo"; break;
case "mp4" : $ctype="video/mpeg"; break;
//The following are for extensions that shouldn't be downloaded
case "php" :
case "css" :
case "js" :
case "htm" :
case "html" :
case "txt" : die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;
default : $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
$header="Content-Disposition: attachment; filename=".$filename.";";
header($header );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$len);
echo file_get_contents($sourceFile);
exit;
答案 0 :(得分:1)
有很多事情可能导致is_file()
失败:
注意:由于PHP的整数类型已签名且许多平台使用32位整数,因此某些文件系统函数可能会为大于2GB的文件返回意外结果。
/var/www/html/images/file.jpg
而不是相对路径/images/file.jpg
?在第二个问题上,即使没有文件检查,.jpg
也会产生错误。
我复制&amp;将您的代码粘贴到我的本地测试环境中,它似乎正常工作,没有任何错误。如果上述信息无效,请通过更多详细信息更新您的问题。