在 Laravel 中透過 Zipper 壓縮檔案至 S3
在 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()
的方法,不然可能會出現記憶體不夠的情形。