php (zip)文件下载设置

普通下载头大概意思,文件输出的地方二选一,小文件下载。如文件较大时注意执行时间与内存使用。可以看php大文件下载

$filename = $_GET['filename'];
$pathname = "./sucai/$filename";
$filesize = filesize($pathname);
 
//跟据路径下载文件
//字节流的方式发送到客户端
header("content-type:application/octet-stream"); 
//header("content-type:application/force-download");
  
//关于断点续传,服务器支持
header("Accept-Ranges:bytes") ;
 
//以附件的形式发送到客户端
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
 
//文件大小比对
header("Content-Length: ". filesize($path));
 
readfile($path);
 
$handle = fopen($pathname, 'rb');
$content = '';
while (!feof($handle)) {
   $content .= fread($handle, 1024);
}
fclose($handle);
echo $content;

项目中用到zip批量打包下载文件,小文件下载。如文件较大时注意执行时间与内存使用。可以看php大文件下载

$param = [
    'uid'   => 1,
    'title' => $db->escape_string('title','string', 'G'),
    'annex' => $db->escape_string('annex','string', 'G'),
];

RequestCheck::checkParam($param['title'], 'title');
RequestCheck::checkParam($param['annex'], 'annex');

$title = '文档下载';
$content = serialize($param);

get_logadd(0, $content, $title, 25, $_USER->id);

if (false !== strpos($param['annex'], ',')) {
    $param['annex'] = explode(',', $param['annex']);
} else {
    $param['annex'] = [$param['annex']];
}

if (false !== strpos($param['title'], '.')) {
    $param['title'] = explode('.', $param['title'])[0];
}

$filename = $param['title'] . '_' . date('Y-m-d H-i-s') . '_' . rand(100, 999) . '.zip';

$files = $param['annex'];

$tmpFile = tempnam('./cache', '');

$zip = new ZipArchive;
$zip->open($tmpFile, ZipArchive::CREATE);
foreach ($files as $file) {
    $fileContent = file_get_contents($file);
    $zip->addFromString(basename($file), $fileContent);
}
$zip->close();

header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=' . $filename);
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: ' . filesize($tmpFile));
@readfile($tmpFile);

posted on   何苦->  阅读(1455)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示