Laravel多个PDF到ZIP

时间:2017-07-09 09:15:15

标签: php laravel

我正在进行外部API调用,该调用返回带有下载URL的多个对象。这些都是PDF-s,我想提供一个ZIP下载链接。

现在的工作方式是我将每个PDF下载到特定的用户文件夹,然后从中制作ZIP并将其呈现给用户。

我认为这是一个有点慢和低效的服务,因为用户将不得不触发ZIP的另一个下载,这样我就让用户基本上等待同一个文件批次的2次下载。

有更聪明的方法可以解决这个问题吗?

$path = '/user_downloads/' . Auth::user()->id . '/';

if (!Storage::disk('uploads')->has($path)) {
    Storage::disk('uploads')->makeDirectory($path);
}

$zipper = new \Chumper\Zipper\Zipper;
$zip_filename = 'zipped/' . uniqid() . '_merged.zip';
foreach (json_decode($res)->hits as $hit) {
    $filename = public_path() . $path . uniqid() . '_file.pdf';
    copy($hit->document_download_link, $filename);
    $zipper->make($zip_filename)->add($filename);
}

2 个答案:

答案 0 :(得分:1)

This question有两种方法可以将文件一个一个地呈现给用户,但用户不太友好,可能会被浏览器阻止。

你可能也可以使用JSZip(没有仔细看过它),但这会使用浏览器的RAM压缩PDF,这是不理想的,特别是在移动设备上。

我认为您当前的解决方案是最好的解决方案。

答案 1 :(得分:1)

add方法可以接收文件数组,因此,我会在foreach内创建文件数组,完成后创建zip:

foreach (json_decode($res)->hits as $hit) {
copy($hit->document_download_link, $filename);
$files[] = public_path() . $path . uniqid() . '_file.pdf';
}

 $zipper->make($zip_filename)->add($files);