在 Laravel 中透過 Zipper 壓縮檔案至 S3

May 23, 2017

在 Laravel 中,你可以透過 Zipper 將你所需要的檔案壓縮成 .zip, 使用上參考官方文件的 README 還蠻容易的。

這篇文章主要是記錄一下我將檔案壓縮後上傳至 S3 失敗的問題。

我們可以透過 Laravel 的 File Storage 來處理一些檔案相關的問題,我使用的場景大概如下:

Storage::disk('local')->put('file.txt', 'Contents');

disk 就是你的儲存裝置,可以設為 local 或是其他例如像是 s3,你可以透過你的 .env 檔案設定做到動態調整的效果, put 兩個參數分別是:檔案名稱內容,相當容易使用。

我在這遇到的問題就是上傳壓縮檔一直不成功,先前上傳圖片透過這樣的方式都沒什麼問題,我一開始上傳的方式如下:

Storage::disk('s3')->put('export/album.zip', storage_path('app/export/album.zip'));

但是上傳上去一直發現檔案只有幾 KB,嘗試好幾次都是這樣,也確認過 local 端的壓縮檔是沒問題的,後來去翻了一下 FileSystem 的 API 文件put method,大概知道問題點在哪裡了:

put(string $path, string $contents, bool $lock = false)

第二個參數接受的是一個 string,但我放入的壓縮檔所以根本就是不對的,所以應該這麼做:

Storage::disk('s3')->put('export/album.zip', file_get_contents(storage_path('app/export/album.zip')));

透過 file_get_contents 這個 method 可以將整個檔案讀成字串,這樣就沒問題了!

補充: 如果在傳送大檔案的情況下,建議使用 Storage::putFile() 或是 Storage::putFileAs() 的方法,不然可能會出現記憶體不夠的情形。