【发布时间】:2016-11-10 17:55:52
【问题描述】:
我有一个 Laravel 网络应用程序,用户可以在其中上传文件。这些文件可能很敏感,虽然它们存储在 S3 上,但它们只能通过我的网络服务器(流式下载)访问。上传后,用户可能希望下载这些文件的选择。
以前,当用户下载文件选择时,我的 Web 服务器会从 S3 下载文件,将它们压缩到本地,然后将压缩文件发送到客户端。但是,由于文件大小,一旦投入生产,服务器响应就会经常超时。
作为一种替代方法,我想通过ZipStream 即时压缩文件,但我运气不佳。 zip 文件要么以损坏的文件结尾,要么本身已损坏并且非常小。
如果可以将 S3 上文件的流资源传递给 ZipStream,解决我的超时问题的最佳方法是什么?
我尝试了几种方法,我最近的两种方法如下:
// First method using fopen
// Results in tiny corrupt zip files
if (!($fp = fopen("s3://{$bucket}/{$key}", 'r')))
{
die('Could not open stream for reading');
}
$zip->addFileFromPath($file->orginal_filename, "s3://{$bucket}/{$key}");
fclose($fp);
// Second method tried get download the file from s3 before sipping
// Results in a reasonable sized zip file that is corrupt
$contents = file_get_contents("s3://{$bucket}/{$key}");
$zip->addFile($file->orginal_filename, $contents);
其中的每一个都位于遍历每个文件的循环中。在循环之后我调用 $zip->finish()。
请注意,我没有收到任何 php 错误,只是文件损坏。
【问题讨论】: