LaravelでS3のファイル操作をする方法まとめ
ご縁がありまして、LaravelからS3を使う機会が多くなってきたので、今のうちにまとめておきます。
AWS側の設定(IAMやバケット作成)、Laravelと接続するまでは、以下の記事などを参考にします。
S3バケットへのアクセス
Storageファサードを使って、設定済みのディスクへの操作ができます。
1 2 3 4 5 6 7 8 9 |
use Storage; class HogeController extends Controller { public function saveImg(Request $request) { $disk = Storage::disk('s3'); // config/filesystems.phpのs3を選択 } } |
ファイルのアップロード
1 2 |
// ファイル保存 $disk->put(【①アップロード先パス】, 【②ファイル】, 【③ファイルパーミッション】); |
①アップロード先のパスを指定:バケットのrootディレクトリからの相対パス
②アップロード対象のファイルデータ
③ファイルパーミッション:第三引数で、ファイル視認性をpublicかprivateのどちらかで宣言できます。
1 2 3 4 5 |
// laravelサーバーのファイルをアップロードする場合 $disk->put($upload_path, file_get_contents($tmp_url), 'public'); // ブラウザからPOSTされたファイルをアップロードする場合 $disk->put($upload_path, $request->file('upfile'), 'public'); |
ファイルのURL(フルパス)を取得
1 |
$disk->url(【バケットのrootディレクトリからの相対パス】); |
https://xxxx.s3.ap-northeast-1.amazonaws.com/upload_file/500.jpg
のような、URLが取得できます。
ファイルのURL(フルパス)を取得
1 |
$disk->url(【バケットのrootディレクトリからの相対パス】); |
https://xxxx.s3.ap-northeast-1.amazonaws.com/upload_file/500.jpg
のような、URLが生成されます。
フロント側へ渡し、画像などを表示する際などに使用します。
ディレクトリ内のすべてのファイルを一覧で取得する
1 |
$disk->files(【バケットのrootディレクトリからの相対パス】); |
1 2 3 4 5 6 7 8 |
array:6 [ 0 => "upload/0625.JPG" 1 => "upload/0626.JPG" 2 => "upload/3480.jpg" 3 => "upload/3481.jpg" 4 => "upload/5006.jpg" 5 => "upload/5007.jpg" ] |
のような、rootからのパスで取得されるので注意です。
全てのディレクトリを一覧で取得する場合は、以下のようにします。
1 |
$disk->directories(【バケットのrootディレクトリからの相対パス】); |
その他のファイル操作
1 2 3 4 5 6 7 8 |
// ファイル削除 $disk->delete(【バケットのrootディレクトリからの相対パス】); // ファイルコピー $disk->copy($old_path, $new_path); // ファイル移動(名前の変更) $disk->move($old_path, $new_path); // ファイルの視認性を変更 $disk->setVisibility($file_path, 'public'); |
ファイルのダウンロード
ファイルダウンロードリングを作る際は、aタグにdownload属性をつけると可能ですが、href先がクロスドメインだと、ブラウザによってはdownload属性で指定したファイル名が無視されたり、場合によってはdownload属性が無効化されます。
その場合は、Larave側でダウンロード処理を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public function downloadFile(Request $request) { $disk = Storage::disk('s3'); // 1.ファイルの名前をURIや、リクエストなどで渡す $file_name = $request->input('file_name') // 2.アップロードしたいディレクトリのパス $s3_dir_pash = 'upload/'; // 1と2をあわせて、アップロード先パスを指定 $s3_file_pash = $s3_dir_pash.$file_name; //'upload/5007.jpg' // ダウンロードする際のファイル名を、Content-Dispositionで指定 $headers = [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'attachment; filename="' . $file_name . '"' ]; return \Response::make($disk->get($s3_file_pash), 200, $headers); //$disk->download($s3_file_pash, $file_name, $headers); //↑の書き方でも良いが、日本語のファイル名でダウロードすると、The filename fallback must only contain ASCII characters.になってしまう。 } |
————————
この記事がお役に立てたら、是非シェアをお願いします^^