文件在下载时损坏

时间:2015-05-05 07:43:45

标签: php file mime

我从其中一个网站获取此代码以进行文件下载。 是否实现了此代码,但它只能下载,但是当我尝试查看文件时,它会显示文件中的错误。 我确实下载了各种文件格式,如pdf,docx,doc,但它总是显示错误。 我已经存储了我的上传文件或在数据库中说文件。它不在目录中。 请告诉我一些关于此的想法。

错误是 -

  

警告:fopen(files / JAVAPROGRAMS.doc)[function.fopen]:无法打开流:否   这样的文件或目录    C:\ wamp \ www \ pages \ candidate \ download.php 在线 75 错误 - 无法打开文件。

mysql_connect('localhost','root','') or die(mysql_error());
//echo "connected"; 
mysql_select_db('talent') or die(mysql_error());
function output_file($file, $name, $mime_type='')
{

 $size = filesize($file);
 $name = rawurldecode($name);
 $known_mime_types=array(
"htm" => "text/html",
"exe" => "application/octet-stream",
"zip" => "application/zip",
"doc" => "application/msword",
"jpg" => "image/jpg",
"php" => "text/plain",
"xls" => "application/vnd.ms-excel",
"ppt" => "application/vnd.ms-powerpoint",
"gif" => "image/gif",
"pdf" => "application/pdf",
"txt" => "text/plain",
"html"=> "text/html",
"png" => "image/png",
"jpeg"=> "image/jpg"
);

if($mime_type==''){
 $file_extension = strtolower(substr(strrchr($file,"."),1));
 if(array_key_exists($file_extension, $known_mime_types)){
    $mime_type=$known_mime_types[$file_extension];
 } 
else 
{
       $mime_type="application/force-download";
};
};

  //turn off output buffering to decrease cpu usage
  @ob_end_clean(); 

  // required for IE, otherwise Content-Disposition may be ignored
  if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');
  header('Content-Type: ' . $mime_type);
  header('Content-Disposition: attachment; filename="'.$name.'"');
  header("Content-Transfer-Encoding: binary");
  header('Accept-Ranges: bytes');

 // multipart-download and download resuming support
 if(isset($_SERVER['HTTP_RANGE']))
 {
  list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
  list($range) = explode(",",$range,2);
  list($range, $range_end) = explode("-", $range);
  $range=intval($range);
  if(!$range_end)
  {
    $range_end=$size-1;
  } 
  else 
  {
    $range_end=intval($range_end);
  }

  $new_length = $range_end-$range+1;
  header("HTTP/1.1 206 Partial Content");
  header("Content-Length: $new_length");
  header("Content-Range: bytes $range-$range_end/$size");
  } 
  else
 {
  $new_length=$size;
  header("Content-Length: ".$size);
 }

  /* Will output the file itself */
 $chunksize = 1*(1024*1024); //you may want to change this
 $bytes_send = 0;
 if ($file = fopen($file, 'r'))
 {
  if(isset($_SERVER['HTTP_RANGE']))
  fseek($file, $range);

  while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length))
  {
    $buffer = fread($file, $chunksize);
    echo($buffer); 
    flush();
    $bytes_send += strlen($buffer);
}
fclose($file);
} else

//If no permissiion
die(mysql_error());
//die
die();
}
 //Set the time out
 set_time_limit(0);

 //path to the file
 $file_path='files/'.$_REQUEST['filename'];


 //Call the download function with file path,file name and file type
 output_file($file_path, ''.$_REQUEST['filename'].'', 'text/plain');

2 个答案:

答案 0 :(得分:0)

试试这个。只需提及正确的文件路径即可。希望它适合你。

ignore_user_abort(true);
set_time_limit(0); // disable the time limit for this script

$path = "/YOUR_FILE_PATH/"; // change the path to fit your    websites document structure
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '',$_GET['download_file']); // simple file name validation
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL); // Remove (more) invalid characters
$fullPath = $path.$dl_file;

if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
              case "pdf":
                          header("Content-type: application/pdf");
                          header("Content-Disposition: attachment;   filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download
    break;
    // add more headers for other content types here
    default;
    header("Content-type: application/octet-stream");
    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    break;
}
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
    $buffer = fread($fd, 2048);
    echo $buffer;
}
}
 fclose ($fd);
 exit;

答案 1 :(得分:-1)

试试这个

 output_file($file_path, ''.$_REQUEST['filename'].'', '');