您可以使用 Laravel 漂亮的統一 API 上傳文件,與許多不同類型的儲存系統交互,從本機磁碟到 S3 等遠端物件儲存。
與許多其他 Laravel 元件一樣,您可以透過儲存外觀與應用程式檔案系統互動:Illuminate/Support/Facades/Storage
此類允許您存取稱為磁碟的儲存驅動程序,這些驅動程式實現了通用介面。因此,您可以更改底層實體存儲,而無需觸及應用程式程式碼。
這不僅允許您以相同的方式從本機檔案系統、FTP 或AWS S3 讀取和寫入,還可以根據您是在本機環境中開發還是在生產中運行應用程式來選擇不同的選項.
如果您想了解如何建立自訂外觀,請閱讀以下文章:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
想要了解更多技術文章,您可以在 Linkedin 或 X 上關注我。
Laravel 透過 config/filesystems.php 設定檔中設定的「磁碟」管理對儲存的存取。每個磁碟都有一個標識名稱和一個驅動程序,可讓您定義將連接到應用程式的儲存系統的實際類型。
根據驅動程序,其他選項將是可配置的。例如,具有本機驅動的磁碟需要設定 root 參數來指示它們對應的實際本機目錄。那些擁有 s3 驅動程式的使用者需要設定各種金鑰、秘密、區域和儲存桶才能存取 AWS S3 或 S3 相容系統。
在預設配置的各種磁碟中,名為 public 的磁碟是最有趣的之一。該磁碟旨在託管那些必須由 Laravel 應用程式公開存取的檔案。
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
正如您在上面的程式碼片段中看到的,磁碟具有本機驅動程序,根目錄是私有 storage/app/public 目錄。
私有目錄如何可以公開存取?
要允許公用磁碟運作,您必須建立一個符號連結以將 Laravel 公用資料夾連接到磁碟中配置的私有根目錄。
幸運的是 Laravel 有一個內建指令可以自動執行此設定。
php artisan storage:link
第一次在電腦上安裝 Laravel 應用程式(包括本機環境)時,應該執行此命令。
當您建立符號連結時,Laravel 會將 storage/app/public 資料夾連接到 public/storage 資料夾。這意味著如果您想在公共頁面中顯示文件,您可以執行以下操作:
{{ asset('storage/file.txt') }}
該檔案物理儲存在 storage/app/public 中,但由於符號鏈接,您可以從路徑 yourdomain.com/storage/filename.ext
訪問它這是必要的,因為公用資料夾通常是 Web 伺服器(Apache、NGINX 等)的根目錄,因此它是您的網站或應用程式可以指向的唯一路徑。符號連結使儲存資料夾的一部分可供外部使用。
以下是允許檔案上傳的 HTML 表單範例:
<form action="/avatar" method="POST" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="avatar"/> <button type="submit"></button> </form>
將此檔案儲存到磁碟非常容易。請求物件具有 file 方法,可讓您取得從文件類型的表單欄位傳送的項目。您可以將輸入欄位的名稱傳遞到 file 方法中來存取前端傳送的檔案。
namespace App/Http/Controllers; use App/Http/Resources/UserResource; class AvatarController extends Controller { public function update(Request $request) { $path = $request->file('avatar')->store("avatars/{$request->user()->id}"); $request->user()->update(['avatar' => $path]); return new UserResource($request->user()); } }
store 方法從請求中取得檔案並將其保存在磁碟上,產生檔案名稱的唯一 ID,同時從請求中提供的 MIME 類型中擷取檔案副檔名。它會傳回已儲存檔案的路徑,因此可以儲存或使用該路徑。
store 將使用 config/filesystem.php 中配置的預設磁碟,但您最終可以動態指定不同的磁碟:
$path = $request->file('avatar') ->store("avatars/{$request->user()->id}", 's3');
直接使用 Storage 門面可以達到相同的結果:
$path = Storage::disk('s3') ->putFile("avatars/{$request->user()->id}", $request->file('avatar'));
我個人更喜歡使用 Storage 門面,因為它使聲明更加明確。
想要了解更多技術文章,您可以在 Linkedin 或 X 上關注我。
Inspector是一款專為軟體開發人員設計的程式碼執行監控工具。您不需要在伺服器層級安裝任何東西,只需安裝 Laravel 套件 就可以開始了。
如果您正在尋找 HTTP 監控、資料庫查詢見解以及將警報和通知轉發到您首選訊息傳遞環境的能力,請免費嘗試 Inspector。註冊您的帳戶。
或在網站上了解更多:https://inspector.dev
以上是在 Laravel 上傳文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!