라 라벨 스토리지에 사용자의 아바타를 업로드했습니다. 액세스하여 뷰에서 렌더링하려면 어떻게해야합니까?
서버가 모든 요청을 (으)로 가리키고 /public
있으므로 /storage
폴더 에있는 경우 어떻게 표시 할 수 있습니까?
답변
가장 좋은 방법은 만드는 것입니다 기호 링크가 잘 지적 @SlateEntropy 같은 아래의 대답을 . 이를 위해 Laravel 은 버전 5.3부터이 작업을 매우 쉽게 수행 할 수 있는 명령 을 포함합니다 .
php artisan storage:link
그것은 당신 public/storage
을 storage/app/public
위해 심볼릭 링크를 만들고 그게 전부입니다. 이제 다음 /storage/app/public
과 같은 링크를 통해 모든 파일에 액세스 할 수 있습니다.
http://somedomain.com/storage/image.jpg
어떤 이유로 든 공유 링크 등에서 심볼릭 링크를 만들 수 없거나 일부 액세스 제어 논리 뒤의 일부 파일을 보호하려는 경우 다음과 같은 특수 경로를 사용할 수 있습니다. 이미지를 제공합니다. 예를 들어 다음과 같은 간단한 폐쇄 경로 :
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;
});
심볼릭 링크가있는 것처럼 파일에 액세스 할 수 있습니다.
http://somedomain.com/storage/image.jpg
당신이 사용하는 경우 개입 이미지 라이브러리 당신은 그것의 내장 사용할 수있는 response
메이크업 물건을 더 간결에 방법 :
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
경고
파일을 수동으로 제공 하면 파일 내용을 읽고 보내기 위해 전체 라 라벨 요청 수명주기를 거치 므로 HTTP 서버가 처리하는 것보다 상당히 느리기 때문에 성능 저하 가 발생 한다는 점에 유의하십시오 .
답변
하나의 옵션은 스토리지 디렉토리의 하위 폴더와 공용 디렉토리 사이에 기호 링크를 작성하는 것입니다.
예를 들어
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
이것은 Laravel 의 개발자 인 Taylor Otwell이 구축 한 배포 관리자 인 Envoyer 에서 사용하는 방법이기도합니다 .
답변
Laravel 5.2 문서에 따르면 공개적으로 액세스 할 수있는 파일은 디렉토리에 저장해야합니다
storage/app/public
웹에서 그들에 액세스 할 수 있도록하려면에서 심볼릭 링크 생성해야 public/storage
하는가 storage/app/public
.
ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage
이제 자산 도우미를 사용하여보기에서 파일에 대한 URL을 만들 수 있습니다.
echo asset('storage/file.txt');
답변
Windows에있는 경우 cmd에서이 명령을 실행할 수 있습니다.
mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars
에서 :
http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
답변
우선 artisan 명령을 사용하여 스토리지 디렉토리에 대한 기호 링크를 작성해야합니다.
php artisan storage:link
그런 다음 모든보기에서 이와 같은 URL 도우미를 통해 이미지에 액세스 할 수 있습니다.
url('storage/avatars/image.png');
답변
모든 개인 이미지와 문서를 저장 디렉토리에 저장하는 것이 좋습니다. 그러면 특정 유형의 사용자가 파일에 액세스하거나 제한 할 수있는 파일 에테르를 완전히 제어 할 수 있습니다.
경로 / 문서를 만들고 컨트롤러 방법을 가리 킵니다 :
public function docs() {
//custom logic
//check if user is logged in or user have permission to download this file etc
return response()->download(
storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'),
'filename.png',
['Content-Type' => 'image/png']
);
}
적중하면 localhost:8000/docs
파일이 있으면 다운로드됩니다.
파일은 root/storage/app/users/documents
위 코드에 따라 디렉토리에 있어야합니다.이 파일은에서 테스트되었습니다 Laravel 5.4
.
답변
적은 수의 개인 이미지 를로드하려는 경우 이미지를 base64로 인코딩하고 <img src="{{$image_data}}">
직접 에코 할 수 있습니다.
$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;
url을 통해 공개적으로 액세스 할 수있는 이미지를 저장하지 않으려는 경우에만이 방법을 사용해야하기 때문에 private을 언급했습니다. 대신 항상 표준 방법을 사용해야합니다 (저장소 / 공용 폴더 연결 및 HTTP 서버로 이미지 제공).
주의 할 인코딩 base64()
두 가지 중요한 다운면이있다 :
- 이미지 크기가 ~ 30 % 증가합니다.
- 모든 이미지 크기를 한 번의 요청으로 결합하여 병렬로로드하는 대신 작은 섬네일에는 문제가되지 않지만 많은 이미지의 경우이 방법을 사용하지 마십시오.
