PHP实现打包下载文件的方法示例
作者:独自等待_ 发布时间:2024-05-11 09:45:54
标签:PHP,打包,下载文件
本文实例讲述了PHP实现打包下载文件的方法。分享给大家供大家参考,具体如下:
/**
* 下载文件
* @param $img
* @return string
*/
public function Download($img)
{
$items = [];
$names = [];
if($img)
{
//用于前端跳转zip链接拼接
$path_redirect = '/zip/'.date('Ymd');
//临时文件存储地址
$path = '/tmp'.$path_redirect;
if(!is_dir($path))
{
mkdir($path, 0777,true);
}
foreach ($img as $key => $value) {
$fileContent = '';
$fileContent = $this->CurlDownload($value['url']);
if( $fileContent )
{
$__tmp = $this->SaveFile( $value['url'] , $path , $fileContent );
$items[] = $__tmp[0];
$names[] = $value['name'].'_'.($key+1).'.'.$__tmp[1];
}
}
if( $items )
{
$zip = new ZipArchive();
$filename = time().'download.zip';
$zipname = $path.'/'.$filename;
if (!file_exists($zipname)) {
$res = $zip->open($zipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($res) {
foreach ($items as $k => $v) {
$value = explode("/", $v);
$end = end($value);
$zip->addFile($v, $end);
$zip->renameName($end, $names[$k]);
}
$zip->close();
} else {
return '';
}
//通过前端js跳转zip地址下载,让不使用php代码下载zip文件
//if (file_exists($zipname)) {
//拼接附件地址
//$redirect = 域名.$path_redirect.'/'.$filename;
//return $redirect;
//header("Location:".$redirect);
//}
//直接写文件的方式下载到客户端
if (file_exists($zipname)) {
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=附件.zip'); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: ' . filesize($zipname)); //告诉浏览器,文件大小
@readfile($zipname);
}
//删除临时文件
@unlink($zipname);
}
}
return '';
}
}
/**
* curl获取链接内容
* @param $url
* @return mixed|string
*/
public function CurlDownload($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$errno = curl_errno($ch);
$error = curl_error($ch);
$res=curl_exec($ch);
curl_close($ch);
if($errno>0){
return '';
}
return $res;
}
/**
* 保存临时文件
* @param $url
* @param $dir
* @param $content
* @return array
*/
public function SaveFile( $url ,$dir , $content)
{
$fname = basename($url); //返回路径中的文件名部分
$str_name = pathinfo($fname); //以数组的形式返回文件路径的信息
$extname = strtolower($str_name['extension']); //把扩展名转换成小写
$path = $dir.'/'.md5($url).$extname;
$fp = fopen( $path ,'w+' );
fwrite( $fp , $content );
fclose($fp);
return array( $path , $extname) ;
}
引用:
$img = [['url'=>'地址url/1.jpg','name'=>'名字']];
Download($img);
希望本文所述对大家PHP程序设计有所帮助。
来源:http://blog.csdn.net/alen_xiaoxin/article/details/72844469


猜你喜欢
- 爬虫中scrapy.Request的更多参数scrapy.Request的参数scrapy.Request(url[,callback,me
- 一、使用xls和xlsx处理Excel表格xls是excel2003及以前版本所生成的文件格式;xlsx是excel2007及以后版本所生成
- 这篇文章主要介绍了Python FTP文件定时自动下载实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 前言超时,指一个协程A开启另一个协程B,A会阻塞等待B一段指定的时间,例如:5秒,A通知B结束(也有可能不通知,让B继续运行)。也就是说,A
- 箱形图概念后面的图形都是一些专业的统计图形,当然也会是我们可视化的对象。箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显
- 一、如何将列表数据写入文件 ⾸先,我们来看看下⾯这段代码,并思考:这段代码有没有问题,如果有问题的话,要怎么改?li = [
- 进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。那什么是多线程?提到多线程这里要说
- 本文主要讲如何不依赖TenserFlow等高级API实现一个简单的神经网络来做分类,所有的代码都在下面;在构造的数据(通过程序构造)上做了验
- LoadRunner监控MySQLhttp://www.docin.com/p-92272846.htmlAdvanced MySQL Pe
- 网上看到一个python写的数独,很好玩,分享给大家。import randomimport itertoolsfrom copy impo
- 注意事项Soft-NMS对于大多数数据集而言,作用比较小,提升效果非常不明显,它起作用的地方是大量密集的同类重叠场景,大量密集的不同类重叠场
- 最近做了一个项目,将从微信下载的音频文件(默认为.amr格式)转化为mp3格式(否则前端播放将会遇到困难)上传到云端。经过一番研究,最终决定
- vm.$delete()vm.$delete用法见官网。为什么需要Vue.delete()?在ES6之前, JS没有提供方法来侦测到一个属性
- 对于xml2ddl项目,Freshmeat.org提供了一整套基于GNU或者GPL通用公共许可证下的Python程序。在一个运行的Pytho
- 小编使用python中的django框架来完成!1,首先用pycharm创建django项目并配置相关环境这里小编默认项目都会创建setti
- 一、引入方式from itertools import cycle二、使用方法我们先来看看它的源码cycle它接收一个可迭代对象,可以将一个
- 本文实例为大家分享了python+pyqt5编写md5生成器的具体代码,供大家参考,具体内容如下学了一下pyqt5,写一个小程序来实践一下。
- mysql exists与not exists实例详解tableA|column1 | column1 |column3 |tableb|c
- FTP服务的主动模式和被动模式在开始之前,先聊一下FTP的主动模式和被动模式,两者的区别 , 用两张图来表示可能会更加清晰一些:主动模式:主
- Console 对象提供对浏览器控制台的接入(如:Firefox 的 Web Console)。不同浏览器上它的工作方式是不一样的,但这里会