php force下载脚本不再有效

时间:2016-05-12 19:56:26

标签: php

我们一直在使用以下脚本下载照片,但现在它已不再适用。在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;

1 个答案:

答案 0 :(得分:1)

有很多事情可能导致is_file()失败:

  1. 您的环境在工作和停止工作之间发生了什么变化?确保检查文件权限,包括父目录。
  2. 它适用于某些图像而不适用于其他图像吗?可能是您的文件大小大于整数存储空间。来自manual
      

    注意:由于PHP的整数类型已签名且许多平台使用32位整数,因此某些文件系统函数可能会为大于2GB的文件返回意外结果。

  3. 文件名是否包含任何外来字符?尝试删除它们。
  4. 您是否尝试过使用完整绝对路径/var/www/html/images/file.jpg而不是相对路径/images/file.jpg
  5. 您是否尝试过其他功能,例如file_exists()
  6. 在第二个问题上,即使没有文件检查,.jpg也会产生错误。

    1. 究竟是什么错误,或者您是指下载损坏的文件?
    2. 我复制&amp;将您的代码粘贴到我的本地测试环境中,它似乎正常工作,没有任何错误。如果上述信息无效,请通过更多详细信息更新您的问题。