Cách tiếp cận tốt nhất là tạo ra một liên kết tượng trưng như @SlateEntropy được chỉ ra rất rõ trong câu trả lời dưới đây . Để giải quyết vấn đề này, kể từ phiên bản 5.3, Laravel bao gồm một lệnh giúp việc này cực kỳ dễ thực hiện:
php artisan storage:link
Điều đó tạo ra một liên kết tượng trưng từ public/storage
đến storage/app/public
cho bạn và đó là tất cả những gì có trong đó. Bây giờ bất kỳ tập tin trong /storage/app/public
có thể được truy cập thông qua một liên kết như:
http://somedomain.com/storage/image.jpg
Nếu vì bất kỳ lý do nào, bạn không thể tạo các liên kết tượng trưng (có thể bạn đang sử dụng lưu trữ được chia sẻ, v.v.) hoặc bạn muốn bảo vệ một số tệp đằng sau một số logic kiểm soát truy cập, có một cách khác là có một tuyến đường đặc biệt đọc và Phục vụ hình ảnh. Ví dụ một tuyến đường đóng cửa đơn giản như thế này:
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $filename);
if (!File::exists($path)) {
abort(404);
}
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
});
Bây giờ bạn có thể truy cập các tệp của mình như bạn muốn nếu bạn có một liên kết tượng trưng:
http://somedomain.com/storage/image.jpg
Nếu bạn đang sử dụng Thư viện hình ảnh can thiệp, bạn có thể sử dụng response
phương thức tích hợp sẵn để làm cho mọi thứ ngắn gọn hơn:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
CẢNH BÁO
Hãy nhớ rằng bằng cách phục vụ thủ công các tệp bạn đang phải chịu một hình phạt hiệu suất , bởi vì bạn đang trải qua toàn bộ vòng đời yêu cầu của Laravel để đọc và gửi nội dung tệp, chậm hơn đáng kể so với việc máy chủ HTTP xử lý nó.