我正在尝试使用PHP从我的Web服务器强制下载文件。 我不是PHP的专家,但我似乎无法解决以0字节大小下载文件的问题。
CODE:
$filename = "FILENAME...";
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
set_time_limit(0);
readfile($file);
有人可以帮忙吗? 感谢。
答案 0 :(得分:6)
您没有检查该文件是否存在。试试这个:
$file = 'monkey.gif';
if (file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}else
{
echo "File does not exists";
}
看看你得到了什么。
您还应该注意,这会强制下载为八位字节流,即纯二进制文件。有些浏览器很难理解文件的确切类型。例如,如果您发送标题为Content-Type: application/octet-stream
的GIF,则浏览器可能不会将其视为GIF图像。您应该添加特定检查以确定文件的内容类型,并发送适当的Content-Type
标头。
答案 1 :(得分:2)
我在phunction中使用了以下方法,到目前为止我还没有遇到任何问题:
function Download($path, $speed = null)
{
if (is_file($path) === true)
{
$file = @fopen($path, 'rb');
$speed = (isset($speed) === true) ? round($speed * 1024) : 524288;
if (is_resource($file) === true)
{
set_time_limit(0);
ignore_user_abort(false);
while (ob_get_level() > 0)
{
ob_end_clean();
}
header('Expires: 0');
header('Pragma: public');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . sprintf('%u', filesize($path)));
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Content-Transfer-Encoding: binary');
while (feof($file) !== true)
{
echo fread($file, $speed);
while (ob_get_level() > 0)
{
ob_end_flush();
}
flush();
sleep(1);
}
fclose($file);
}
exit();
}
return false;
}
您只需执行以下操作即可尝试:
Download('/path/to/file.ext');
答案 2 :(得分:2)
您需要指定Content-Length
标题:
header("Content-Length: " . filesize($filename));
此外,您不应发送Content-Transfer-Encoding
标头。 “{3}}和HTTP/1.0都表示”HTTP不使用RFC 1521的内容传输编码(CTE)字段“。
答案 3 :(得分:1)
此问题与我的网站项目相同。这个代码我用过:
<?php
$file = $_SERVER["DOCUMENT_ROOT"].'/.../.../'.$_GET['file'];
if(!file)
{
// File doesn't exist, output error
die('file not found');
}
else
{
//$file_extension = strtolower(substr(strrchr($file,"."),1));
$file_extension = end(explode(".", $file));
switch( $fileExtension)
{
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 "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
nocache_headers();
// Set headers
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public"); // required for certain browsers
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=".$file.";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
readfile($file);
}
?>
我认为问题出在服务器设置上,如PHP设置或缓存设置,但我不知道这样做我的意见。
答案 4 :(得分:1)
我这样做是为了下载PDF ...
$filename = 'Application.pdf';
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=$filename");
echo $pdf;
我认为你错过了最后一行,你实际上在$file
发送了你所拥有的文件内容。
巴勃罗
答案 5 :(得分:0)
当我将目录更改为文件位置时,文件打开了。
$reportLocation = REPORTSLOCATION;
$curDir = getcwd();
chdir($reportLocation);
if (file_exists($filename)) {
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Length: ' . filesize($filename));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
ob_clean();
flush();
readfile($filename);
}
chdir($curDir);
答案 6 :(得分:0)
诀窍是检查file_exists以确认正确的路径。 令人困惑的是,对于PHP路径,您不需要从&#39; /&#39;开始。说你的网站开始路径。
'/folder/file.ext' #bad, needs to know the real full path
php /中的已经是网站的主要路径,你不需要提及它。只是:
'folder/file.ext' #relative to the / website
这适用于file_exists,header filename,readfile等...
答案 7 :(得分:0)
如果脚本工作适用于小文件,但适用于大文件,则返回0字节文件。您必须通过php.ini increate memory_limit 您也可以在代码之前添加以下行
ini_set('memory_limit','-1');