有没有好的方法实现多文件下载,现在有好多文件地址在一个数组里面,循环一次下载貌似行不通,有没有其它方案呢
现在的需求是下载第三方的文件,已经统计出来url了,还有根据url去把文件放到不同的目录,这只能后台去处理,那打包的方法又不能用了。
有没有好的方法实现多文件下载,现在有好多文件地址在一个数组里面,循环一次下载貌似行不通,有没有其它方案呢
现在的需求是下载第三方的文件,已经统计出来url了,还有根据url去把文件放到不同的目录,这只能后台去处理,那打包的方法又不能用了。
一个HTTP请求中不允许一次下载多个文件,如果你有多个文件需要下载,可以打包成一个zip。
也可以用JavaScript去创造多个<a>标签,模拟<a>标签的点击操作,这样其实是发出了3个HTTP请求:
function downloadAll(urls) {
var link = document.createElement('a');
link.setAttribute('download', null);
link.style.display = 'none';
document.body.appendChild(link);
for (var i = 0; i < urls.length; i++) {
link.setAttribute('href', urls[i]);
link.click();
}
document.body.removeChild(link);
};
downloadAll(<?php echo json_encode($urls) ?>);
这个其实有解决方案,通常的解决方案是将文件打包,然后将打包后的文件进行下载,就成为了一个压缩包.以前在弄网盘的时候,曾用过一个非常好用的包.用来生成压缩包的.Zippy,以下是一个示例,摘抄的:
require __DIR__ . '/vendor/autoload.php';
$zippy = Zippy::load();
$archive = $zippy->create('archive.zip', array(
'folder' => '/path/to/directory', // will create a folder at root
'http://www.google.com/logo.jpg', // will create a logo.jpg file at root
fopen('https://www.facebook.com/index.php'), // will create an index.php at root
'directory/image.jpg' => 'image.jpg', // will create a image.jpg in 'directory' folder
));
请使用composer来安装:
composer require alchemy/zippy
当然,这一种方式很lower,一旦文件一大,ok,你就等着死机吧.所以有很多云盘会限制大小.
来一种高级一点的方案,就简单提一下.workerman,swoole这些解决方案.
先将文件打包命令发送过去.然后php异步打包.让前端去查询打包任务是否完成.
完成了在下来.
如果说,你仅仅只是想让前端下载多个文件,而不是统一打包.那你就让前端多模拟请求,这样也可以实现.
但是如果是文件夹的话.恭喜你,你要完蛋了,前端忙死了
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答693 阅读✓ 已解决
2 回答2.2k 阅读
1 回答682 阅读✓ 已解决
泻药
打包成zip进行下载,
类似于百度网盘,下载文件夹,其实下载的是pack.zip
php自带zip类库ziparchive