我正在进行外部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);
}
答案 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);