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

时间:2021-01-24 12:50:23

标签: php laravel amazon-s3 ziparchive

所以我一直在为此寻找解决方案,我认为这与我在存储上创建 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

1 个答案:

答案 0 :(得分:0)

您无权访问 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 文件。