답변:
가장 좋은 방법은 만드는 것입니다 기호 링크가 잘 지적 @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 서버가 처리하는 것보다 상당히 느리기 때문에 성능 저하 가 발생 한다는 점에 유의하십시오 .
public디렉토리에 저장하는 것이 좋습니다 . 이렇게하면 HTTP 서버가 훨씬 빠르게 처리 할 수있는 이미지 응답을 작성해야하는 오버 헤드를 피할 수 있습니다.
하나의 옵션은 스토리지 디렉토리의 하위 폴더와 공용 디렉토리 사이에 기호 링크를 작성하는 것입니다.
예를 들어
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
이것은 Laravel 의 개발자 인 Taylor Otwell이 구축 한 배포 관리자 인 Envoyer 에서 사용하는 방법이기도합니다 .
storage공개적으로 저장된 사용자 아바타를 표시하는 방법을 물었습니다 . 일반적으로 아바타는 어떤 종류의 액세스 제어도 필요하지 않습니다. 어떤 종류의 미들웨어 또는 경로를 사용하여 보안이 필요하지 않은 경우 리소스에 낭비되는 것입니다. 라 라벨 5.2부터 심볼릭 링크를 사용 하는 공용 파일 ( laravel.com/docs/5.2/filesystem )을 위한 별도의 "디스크"파일이 존재한다는 점도 주목할 가치가 있습니다 .
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
모든 개인 이미지와 문서를 저장 디렉토리에 저장하는 것이 좋습니다. 그러면 특정 유형의 사용자가 파일에 액세스하거나 제한 할 수있는 파일 에테르를 완전히 제어 할 수 있습니다.
경로 / 문서를 만들고 컨트롤러 방법을 가리 킵니다 :
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()두 가지 중요한 다운면이있다 :
사이트 이름없이
{{Storage::url($photoLink)}}
api JSON felids에 추가하기 위해 사이트 이름을 예제에 추가하려는 경우
public function getPhotoFullLinkAttribute()
{
return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}
당신이 나와 같고 어떻게 든 전체 파일 경로가있는 경우 (필요한 사진에서 glob () 패턴과 일치하여 전체 파일 경로로 끝납니다) 저장소 설정이 잘 연결되어 있습니다 (예 : 경로) 문자열 storage/app/public/)을 가지고 있다면 아래의 작은 더러운 핵을 사용할 수 있습니다 : p)
public static function hackoutFileFromStorageFolder($fullfilePath) {
if (strpos($fullfilePath, 'storage/app/public/')) {
$fileParts = explode('storage/app/public/', $fullfilePath);
if( count($fileParts) > 1){
return $fileParts[1];
}
}
return '';
}
디스크 'local'이 작동하지 않으면 다음을 시도하십시오.
'default' => env('FILESYSTEM_DRIVER', 'public'),에서project_folder/config/filesystem.phpphp artisan config:clearphp artisan storage:link업로드 된 이미지의 URL을 얻으려면 이것을 사용할 수 있습니다 Storage::url('iamge_name.jpg');