Laravel 使用 s3 存储桶上的文件创建 zip

Laravel creating zip with files on s3 bucket

所以我一直在尝试为此寻找解决方案,我认为这与我在存储上创建 zip 的方式有关。

控制器:

$disk = Storage::disk('s3');

        if($disk->exists('storage/mail_attachments/'.$this->zip_file)) {
            $disk->delete('storage/mail_attachments/'.$this->zip_file);
        }

        $zip = new \ZipArchive();
        $zip->open($disk->put('storage/mail_attachments/'. $this->zip_file, ''), \ZipArchive::CREATE);

        $download_file = file_get_contents(config('filesystems.disks.s3.url') . '/storage/mail_attachments/user_form_'.$this->uf_id.'.pdf');

        $zip->addFromString(basename(config('filesystems.disks.s3.url') . '/storage/mail_attachments/user_form_'.$this->uf_id.'.pdf'), $download_file);
        $zip->close();

我们将其托管在 Laravel vapor 上并在日志中看到:

ZipArchive::close(): Failure to create temporary file: Read-only file system

上面的代码设法创建了 zip 文件,但在查看时它是空的。使用 public_paths 创建 zip 效果很好。

如有任何帮助或建议,我们将不胜感激!

更新

设法让它与答案一起工作,并用谷歌搜索找到这个线程,它提供了制作 zip 的额外步骤 https://laracasts.com/discuss/channels/vapor/zipping-file-on-laravel-vapor

您无权访问 lambda 上的本地文件存储,因为它是无服务器的。

在您的 config/filesystem.php

中创建一个新磁盘
'tmp' => [
  'driver' => 'local',
  'root' => env('USE_LAMBDA_STORAGE', true) ? "/tmp" : storage_path('app/temp'),
  'url' => env('USE_LAMBDA_STORAGE', true) ? "/tmp" : storage_path('app/temp'),
],

使用 $disk = Storage::disk('tmp'); 在此处创建 zip 文件。