下载时文件损坏

Posted

技术标签:

【中文标题】下载时文件损坏【英文标题】:File getting corrupted on downloading 【发布时间】:2015-07-14 19:58:49 【问题描述】:

我从其中一个站点获得了此代码,用于文件下载。 确实实现了此代码,但它只能下载,但是当我尝试查看文件时,它显示文件中有错误。 我确实下载了各种文件格式,如 pdf、docx、doc,但它总是显示错误。 我已将我的上传或说文件存储在数据库中。它不在目录中。 请为此建议我一些想法。

错误是 -

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

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');

【问题讨论】:

此代码仅适用于文件系统上的文件,您需要重写此代码以使用您的 SQL 数据库。 您发布的脚本从文件系统中读取文件。该错误表明它找不到该文件。您需要为脚本提供正确的路径。如果您已将文件存储在数据库中,则需要提供代码来检索它。我在这里看不到。 @AndriyStruk...你能建议我如何实现这一点吗...因为我所有的文件都在数据库中...我只需要下载并查看它。谢谢 @HoboSapiens..谢谢你......正如你所说,我需要给出正确的路径......我应该在哪里提到它。如果有任何链接或某种代码格式,我将参考此文件下载代码并查看它,请帮助我。对不起,我真的在问你,但我被过去的 3 小时困住了。所以终于发到这里了。 【参考方案1】:

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

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;

【讨论】:

只是一些修改和它的工作。 fopen($_FILES["UploadFileName"]["tmp_name"], 'r')) 并添加 -> header("Content-Length: ".filesize($filePath));【参考方案2】:

试试这个

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

【讨论】:

@MadhuriPhaltane...是我代码中我需要放这个的最后一行吗? 是的。将下载 doc 文件,而不是将参数 'text/plain' 作为空白参数。在这里,您强制下载文件。可能是这种情况。 @MadhuriPhaltane..我使用了上面的代码..但它给出了同样的错误-无法打开流。

以上是关于下载时文件损坏的主要内容,如果未能解决你的问题,请参考以下文章

Angular 7 下载 blob 时文件损坏

设置文件大小时php下载限制zip损坏

如何在 Excel 下载时抑制文件损坏警告?

如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误

.exe 文件从服务器下载时损坏

下载文件,winsock recv() 到 fstream 写入,文件损坏