php多文件下载的问题

有没有好的方法实现多文件下载,现在有好多文件地址在一个数组里面,循环一次下载貌似行不通,有没有其它方案呢

现在的需求是下载第三方的文件,已经统计出来url了,还有根据url去把文件放到不同的目录,这只能后台去处理,那打包的方法又不能用了。

阅读 6.5k
5 个回答

泻药
打包成zip进行下载,
类似于百度网盘,下载文件夹,其实下载的是pack.zip

php自带zip类库ziparchive

<?php
$zip = new ZipArchive;
if ($zip->open('pack.zip',ZIPARCHIVE::CREATE) === TRUE)
{
    foreach($fileArray as $file)
    {
        $zip->addFile($file, 'newname.txt');
    }
    $zip->close();
}
?>

一个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) ?>);

HTTP 请求么?
有两种解决方法:

  • 打包下载,即:在服务端将多文件打包成一个压缩包;
  • 通过 Ajax ,一次点击触发多次请求;

这个其实有解决方案,通常的解决方案是将文件打包,然后将打包后的文件进行下载,就成为了一个压缩包.以前在弄网盘的时候,曾用过一个非常好用的包.用来生成压缩包的.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异步打包.让前端去查询打包任务是否完成.
完成了在下来.
如果说,你仅仅只是想让前端下载多个文件,而不是统一打包.那你就让前端多模拟请求,这样也可以实现.
但是如果是文件夹的话.恭喜你,你要完蛋了,前端忙死了

如果资源是第三方的,自己不能再后端压缩的话,就只能通过前端来进行了。要么就是模拟点击下载链接标签进行下载,要不就是将资源地址拿到,之后进行下载。可以参考一下这个多文件下载

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题