下载时文件损坏
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.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');
【问题讨论】:
此代码仅适用于文件系统上的文件,您需要重写此代码以使用您的 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..我使用了上面的代码..但它给出了同样的错误-无法打开流。以上是关于下载时文件损坏的主要内容,如果未能解决你的问题,请参考以下文章