[Laravel] 스토리지 사용법
스토리지 사용법
laravel 에서 데이타를 저장하는 장소로 storage라는 폴더를 사용합니다.
storage 위치
일반적으로는 storage 하위의 app 이란 폴더가 기본으로 사용됩니다.
[APP Project]/storage/app
public 심볼릭 링크
여기서 주목할 점은 storage/app 은 일반 유저들이 직접 접근을 할 수 없다.
따라서 파일의 보안성은 높아지는 반면에 브라우저로 접근하여 이미지등을 가져올 수 없다.
그래서 사용하는 것이 심볼릭 링크다.
[APP Project]/storage/app 하위 디렉토리에 public 이라는 것이 있는데 이것을 실제 public ([APP Project]/public) 과 심볼링 링크를 걸어 두는 것이다.
php artisan storage:link
// 실행결과
The [/home/[APP Project]/public/storage] link has been connected to [/home/[APP Project]/storage/app/public].
The links have been created.
위와같이 처리하면 onstory.fun/storage/image.png 로 접근하면 [APP Project]/storage/app/public 에 등록된 이미지를 호출 할 수 있다.
따라서 프로그램시 다운로드용이미지는 /storage/app 이하로(보안을 위해서) 위치시키고 별도의 다운로드 프로그램을 만들어 주고
일반 이미지는 /storage/app/public 이하에 두어 접근성을 용이하게 한다.
기본적인 저장
아래는 이미지 url을 받아서 storage 에 저장하는 프로그램 입니다.
아래의 결과는 [APP Project]/storage/app/avatar/pondol 이라는 파일이 저장됩니다.
put
Storage에 데이타를 저장할 경우 사용됩니다.
그 데이타가 string 인지 file인지에 따라 약간의 사용법상 차이가 있습니다.
String 을 저장할 경우
use Illuminate\Support\Facades\Storage;
..........
$contents = file_get_contents($url);
$name = 'pondol'
Storage::put('avater/'.$name, $contents); // file_get_contents 으로 받을 경우 'avater/'.$name 이라는 "파일"에 contents가 write되고
파일을 저장할 경우
$avatar = $request->file('avatar');
$name = 'pondol'
Storage::put('avater/'.$name, $avatar); // $request->file 로 받을 경우 'avater/'.$name 이라는 "폴더" 하위로 avatar가 write된다.
파일삭제
특정 파일을 삭제할 경우 사용합니다.
Storage::delete('file.jpg');
Storage::delete(['file.jpg', 'file2.jpg']);
Storage::disk('s3')->delete('path/file.jpg');
Directoy 관련
deleteDirectory
디렉토리및 디렉토리에 있는 모든 파일들을 삭제합니다.
Storage::deleteDirectory($directory);
다운로드
return Storage::download('file.jpg');
return Storage::download('file.jpg', $name, $headers); // name이 있을 경우 원파일을 주어진 이름으로 변경하여 다운로드 합니다.
// 아래와 같이 Response를 사용하여 처리 가능합니다.
return Response::download(file.jpg, 'file_name', [
'Content-Length: '. filesize($result['file_path'],)
]);
파일 URLs
use Illuminate\Support\Facades\Storage;
$url = Storage::url('file.jpg');
파일 Path
$path = Storage::path('file.jpg');
파일 메타
size
use Illuminate\Support\Facades\Storage;
$size = Storage::size('file.jpg')
수정일
$time = Storage::lastModified('file.jpg');
mimeType
$mime = Storage::mimeType('file.jpg');