1. /**
  2. * 下载图片并生成压缩包
  3. * @param $arr 资源数组
  4. * @return string
  5. */
  6. function downloadZipImg($arr)
  7. {if(is_array($arr)&&$arr){
  8. foreach ($arr as $key=>$val){$array=array();$array['img']='';//资源存放地址$array['YFJMC']='';//资源重命名名称
  9. $picAllArr[]=$array;
  10. }
  11. }else{
  12. echo "下载失败,请选择资源";
  13. die();
  14. }
  15. $tmpDir = ''; // 存放路径 绝对路径/相对路径
  16.  
  17. if (!file_exists($tmpDir)) {
  18. //创建文件夹
  19. mkdir($tmpDir, 0777, true);
  20. }
  21. $zipName = date('His') . mt_rand(1000, 9999) . '.zip'; // 压缩包文件名
  22. $zipNameUrl = $tmpDir . $zipName; // 文件路径
  23.  
  24. // 生成文件
  25. $zip = new \ZipArchive();
  26. if ($zip->open($zipNameUrl, \ZipArchive::OVERWRITE) !== true) {
  27. //OVERWRITE 参数会覆写压缩包的文件 文件必须已经存在
  28. if ($zip->open($zipNameUrl, \ZipArchive::CREATE) !== true) {
  29. // 文件不存在则生成一个新的文件 用CREATE打开文件会追加内容至zip
  30. echo "下载失败,文件夹不存在";
  31. die();
  32. }
  33. }
  34.  
  35. foreach ($picAllArr as $file=>$fileval) {
  36. //判断图片是否存在
  37. $isFile = checkFileExists($fileval['img']);
  38. if (!$isFile) {
  39. continue;
  40. }
  41. //抓取图片内容
  42. $fileContent = file_get_contents($fileval['img']);
  43. //添加图片
  44. $zip->addFromString(basename($fileval['img']), $fileContent);
  45. //重命名文件
  46. $zip->renameName(basename($fileval['img']), $fileval['YFJMC']);
  47. }
  48. // 关闭
  49. $zip->close();
  50.  
  51. //没有文件
  52. if (!file_exists($zipNameUrl)) {
  53. echo "下载失败,图片不存在或无法下载";
  54. die();
  55. }
  56. header("Cache-Control: public");
  57. header("Content-Description: File Transfer");
  58. header('Content-disposition: attachment; filename=' . $zipName); //文件名
  59. header("Content-Type: application/zip"); //zip格式的
  60. header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
  61. header('Content-Length: ' . filesize($zipNameUrl)); //告诉浏览器,文件大小
  62.  
  63. // 下面2步必须要
  64. ob_clean();
  65. flush();
  66.  
  67. @readfile($zipNameUrl);
  68. unlink($zipNameUrl); // 删除文件
  69. exit;
  70. }
  1. /**
  2. * 判断文件是否存在,支持本地及远程文件
  3. * @param String $file 文件路径
  4. * @return Boolean
  5. */
  6. function checkFileExists($file)
  7. {
  8. // 远程文件
  9. if (strtolower(substr($file, 0, 5)) == 'https') {
  10. // 远程文件
  11. $header = get_headers($file, true);
  12. return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
  13.  
  14. } elseif (strtolower(substr($file, 0, 4)) == 'http') {
  15. // 远程文件
  16. $header = get_headers($file, true);
  17. return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
  18. } else {
  19. // 本地文件
  20. return file_exists($file);
  21. }
  22. }
  1.  
  1.  

php zip下载附件到压缩包并浏览器下载的更多相关文章

  1. java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片

    因为业务的需要,公司产品要求商品详情页面有个下载的功能 找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法 跟同事沟通后发现他那里有个下载的方法,不过是C#写 ...

  2. Selenium 设置浏览器下载 Firefox 和Chrome

    当我们在使用Selenium运行自动化测试时,偶尔需要用到下载功能,但浏览器的下载可能会弹出下载窗口,或者下载路径不是我们想要保存的位置,所以在通过Selenium启动浏览器时需要做相关的设置,将使这 ...

  3. java如何压缩多个文件到压缩包,并下载到浏览器?

    java压缩多个文件到压缩包,并下载到浏览器   解决方法: 完整的方法如下,很简单,亲试有效,极力推荐. 我是以流作为文件,而不是file,循环把所有pdf文件压缩到pdf.zip压缩包中. 1.前 ...

  4. Nginx 配置下载附件让浏览器提示用户是否保存

    Nginx配置下载附件让浏览器提示用户是否保存   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...

  5. php 通过header下载中文文件名 压缩包损坏或文件不存在的问题

    开发中大家都是使用的utf8编码,昨天遇到一个奇坑,本是一件很小的问题,解决也浪费了个吧小时.废话不多说,植入正题: 文件下载方式:通过header二进制流文件下载需求: 文件上传保留文件名不变数据字 ...

  6. C# 导出excel的压缩包到浏览器页面

    需求背景:TCX_1710项目产品质量导出功能,客户希望每个总成导出到一个Excel表中 实现分析:客户选择时间段,点击导出按钮,默认导出开始时间当天的数据,每个总成一个Excel,将各个Excel打 ...

  7. Firefox下载附件乱码的解决办法

    通过在http的header里设置fileName下载附件时,中文文件名通过chrome浏览器下载时正常,通过firefox下载时为乱码: 原来的Java代码: response.addHeader( ...

  8. asp.net 浏览器下载文件的四种方式

    // 方法一:TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { Response.ContentT ...

  9. java上传附件,批量下载附件(一)

    上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...

  10. 在Linux终端使用W3M浏览器下载文件

    在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...

随机推荐

  1. 如何修改SAO用户密码

    KingbaseES SAO 用户是专门用于审计管理的用户,用户配置审计策略需要使用该用户.在initdb 完成后,SAO  用户的默认密码保存在参数 sysaudit.audit_table_pas ...

  2. JDK 自带的服务发现框架 ServiceLoader 好用吗?

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 Github · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  3. 往harbor上传镜像

    下载镜像并给镜像打tag [root@hdss7-200 harbor]# docker pull nginx:1.7.9 [root@hdss7-200 harbor]# docker images ...

  4. 关于Elasticsearch使用java的说明

    从Elastic 7.0开始,我们可以不安装JAVA.安装包包含一个相匹配的JAVA版本在里面. Elasticsearch包含来自JDK维护者(GPLv2 + CE)的捆绑版OpenJDK. 要使用 ...

  5. Docker 查看容器映射路径

    使用以下命令:container_name 是容器的名字,也可以写容器的ID. docker inspect container_name | grep Mounts -A 20 docker ins ...

  6. Kafka Eagle 3.0.1功能预览

    1.概述 最近有同学留言,关于Kafka Eagle的一些使用问题.今天笔者就为大家来详细介绍Kafka Eagle 3.0.1的功能以及使用方法. 2.内容 在3.0.1版本中,EFAK优化了分布式 ...

  7. .NET下数据库的负载均衡(有趣实验)

    相关下载: 数据库的负载均衡-示例代码(dp1-DbBalance.rar) 数据库的负载均衡-示例代码(dp1-DbBalance.rar) 支持.Net/.Net Core/.Net Framew ...

  8. Codeforces Round #710 (Div. 3)

    emmm,就ac了3题 A题转换推下公式. tB题模拟,在第一个与最后一个变x后,直接i下标+k,判断当前下标前一个befor与最后一个last距离是否>k,是的话在当前下标往前找*字符然后改为 ...

  9. 数据结构之单链表(基于Java实现)

    链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存. 注:在java中没有指针的概念,可以理解为 ...

  10. 后端框架的学习----mybatis框架(7、使用注解开发)

    7.使用注解开发 1.注解在接口上实现 /** * 查询用户 */ @Select("select * from user") public List<User> ge ...