这涉及使用PHP下载文件
我的php版本是5.3.5,而我的apache是2.2.17
我正在尝试下载我在服务器上传的文件(pdf,jpg,tiff),并且他们下载了相同的大小和类型,但我看不到它们。我猜它们没有被复制好。但是当我打开原始上传的那些时,他们工作得很好。 我已经看到几乎所有出现的问题都是按照建议出现的,而且没有人回答这个问题,只有类似的问题是this,但仍然没有回答我的问题。
下载我正在使用此代码
header("Content-type: application/force-download");
header('Content-Disposition: inline; filename="' . $dir . '"');
header("Content-Transfer-Encoding: Binary");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-length: ".filesize($dir));
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file . '"');
readfile("$dir");
其中$dir="62756d616769636e63/646973736572746174/ehddggh/1.JPG"
和$file="1.JPG"
任何人都可以给我一些关于我做错的提示,或者给我一个更好的下载文件解决方案吗?
答案 0 :(得分:3)
这有点像你在下载的文件中得到额外的(虚假的)内容。
确保在文件中的PHP打开标记之前没有BOM表头,空格或其他任何内容;此外,在关闭PHP标记之后,您没有尾随空格或任何其他数据(如果您关闭PHP标记)。
另外,请稍微清理一下代码:为什么有多个Content-Type
标头?为什么有多个Content-Disposition
标题?
答案 1 :(得分:1)
readfile($dir); // without the quotes?
另外,确保$ dir确实存在
is_file($dir)
或file_exists($dir)
答案 2 :(得分:1)
谢谢大家的答案。我将下载作为函数调用其中包含其他函数的文件,所以最后我不得不单独编写一个脚本,除了其他文件。我的问题是我需要它是安全的,只有下载一个文件,如果它属于用户并且用户已登录,所以我发送了我需要的所有数据,加密并在脚本中我使用了一系列的东西来看看所有者是否真的是登录用户。因此,如果有人想知道这是我使用的代码并且工作得很好。
<?php
session_start();
$a=$_GET['a'];
$parts=explode("-",$a);
$tres=$parts[0];
$nombre=$partes[1];
$dbcodletra=substr($tres,2);
if($dbcod!=$_SESSION["username"])$boolt=0;
if($ext==1) $extl=".jpg";
if($ext==2) $extl=".jpeg";
if($ext==3) $extl=".tif";
if($ext==4) $extl=".tiff";
if($ext==5) $extl=".pdf";
if($ext==6) $extl=".doc";
if($ext==7) $extl=".docx";
if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if (file_exists($dir) && $boolt) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($dir));
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($dir));
ob_clean();
flush();
readfile($dir);
exit;
}else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">";
?>
答案 3 :(得分:1)
在两年前的问题上向前推进......
我遇到类似的问题,无法打开损坏的下载(右键单击&amp; save-as完美运行)。在看了@Jon's回答后,我发现他正在接受一些事情。如果查看readfile的文档(下面链接),您将在其示例中看到ob_clean(),flush()和exit。所有这些都将最大限度地减少响应中额外字符数据的泄漏。我刚刚复制了他们的例子#1,我的问题就解决了。
答案 4 :(得分:0)
你的标题看起来很乱,试试这样做:
header('Pragma: public');
header('Cache-Control: public, no-cache');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($dir));
header('Content-Disposition: attachment; filename="' . basename($dir) . '"');
header('Content-Transfer-Encoding: binary');
readfile($dir);