我在服务器上有一个tar存档,必须可以通过php下载。这是我用过的代码:
$content=file_get_contents($tar);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=$tar");
header("Content-Length: ".strlen($content));
unlink($name);
die($content);
文件已下载但文件已损坏且无法打开。我认为标题有问题,因为服务器上的文件可以打开而没有问题。你知道我怎么能解决这个问题呢?
更新 我试图像这样打印一个iframe:
<iframe src="<?php echo $tar?>"></iframe>
下载工作正常,所以我确信标题中缺少一些内容。
答案 0 :(得分:5)
我必须这样做时使用了这段代码:
function _Download($f_location, $f_name){
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($f_location));
header('Content-Disposition: attachment; filename=' . basename($f_name));
readfile($f_location);
}
_Download("../directory/to/tar/raj.tar", "raj.tar");
//or
_Download("/var/www/vhost/domain.com/httpdocs/directory/to/tar/raj.tar", "raj.tar");
试试。
答案 1 :(得分:5)
请勿使用file_get_contents()
,然后使用echo
或print
输出文件。这会将文件的全部内容加载到内存中。一个大文件可以/将超过你的脚本memory_limit
并杀死脚本。
为了将文件的内容转储到客户端,最好使用readfile()
- 它将正确地填充文件块并在客户端将它们吐出而不会超出可用内存。请记住在这之前关闭输出缓冲,否则你基本上只是再次file_get_contents()
所以,你最终得到了这个:
$tar = 'somefile.tar';
$tar_path = '/the/full/path/to/where/the/file/is' . $tar;
$size = filesize($tar_path);
header("Content-Type: application/x-tar");
header("Content-Disposition: attachment; filename='".$tar."'");
header("Content-Length: $size");
header("Content-Transfer-Encoding: binary");
readfile($tar_path);
如果你的tar文件实际上是gzip压缩文件,那么请改用“application / x-gtar”。
如果文件在下载后仍然出现损坏,请在客户端进行一些检查:
答案 2 :(得分:1)
尝试以下内容:
$s_filePath = 'somefile.ext';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. s_filePath.'"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Cache-control: private');
header('Pragma: private');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header("Content-Length: ".filesize($s_filePath));
$r_fh = fopen($s_filePath,'r');
while(feof($r_fh) === false) {
$s_part = fread($r_fh,10240);
echo $s_part;
}
fclose($r_fh);
exit();
答案 3 :(得分:1)
使用Content-Type:application / octet-stream或Content-Type:application / x-gtar
答案 4 :(得分:0)
确保您没有回显任何不是文件输出的内容。在标题
之前调用ob_clean()