まずはstorage:linkしておく
- ファイルをstorageに保存する場合は、最初にシンボリックリンクを貼る作業が必要
php artisan storage:link
フォームで選択されたファイルをControllerに渡す
- ルーティングが下記の場合
Route::post('/upload', [\App\Http\Controllers\FileController::class, 'upload'])->name('upload');;
- formタグでsubmitする場合
<form method="POST" action="{{ route('upload') }}" enctype="multipart/form-data">
@csrf
<input type="file" name="file" />
<button>アップロード</button>
</form>
- ajaxで渡す場合
<script>
function upload(event) {
let files = event.target.files || event.dataTransfer.files
let file = files[0]
let formData = new FormData()
formData.append('file', file)
fetch('/upload', {
method: 'POST',
body: formData,
}).then(function (response) {
return response.clone().json()
}).then(function (json) {
if (json.status === 'ok') {
// アップ完了時の処理
}
}).catch((error) => {
console.error('Error:', error)
})
}
</script>
ajaxの場合はCORS問題があるので、ルーティングはroutes/api.php
の方に記載する
Controller側で受け取ってアップロードする
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileController extends Controller
{
/**
* 画像アップロード
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function upload(Request $request)
{
// ファイルを受け取って一意の名前をつける
$file = $request->file('file');
$filename = now()->format('YmdHis') . uniqid('', true) . "." . $file->extension();
// storageに保存
$path = $file->storeAs('uploaded/', $filename, 'public');
// ステータスとアップロード先のURLを返却する
return response()->json([
'status' => 'ok',
'path' => Storage::url($path),
]);
}
}
UploadedFileから諸々の情報を取得する
- 元々のファイル名
$original_name = $request->file('file')->getClientOriginalName();
- ファイルのタイプ
$type = $request->file('file')->getMimeType();
似たようなメソッドでgetClientMimeType()
もあるが、
こっちはファイルの拡張子を見ているだけなので使わない
アップロードされたファイルが画像かどうかチェックする
//*** PHP8以降の場合 ***//
if(str_contains($request->file('file')->getMimeType(),'image')) {
// 画像の場合の処理
}
//*** PHP8以前の場合 ***//
if (strpos($request->file('file')->getMimeType(), 'image') !== false) {
// 画像の場合の処理
}
随時加筆予定・・
Laravelで画像を扱うときによく使用する
UploadedFile
に関してよく使う事項などをメモ書きとして残しておく