store-manage/app/Http/Controllers/Api/FileUploadController.php

58 lines
1.5 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Exceptions\RuntimeException;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\File;
class FileUploadController extends Controller
{
public function __invoke(Request $request)
{
$request->validate(
rules: [
'file' => [
'bail',
'required',
File::types(['image/jpeg', 'image/png'])
->extensions(['jpg', 'jpeg', 'png'])
->max(20 * 1024),
],
],
attributes: [
'file' => '文件',
],
);
/** @var \Illuminate\Http\UploadedFile */
$file = $request->file('file');
if ($path = $file->storeAs(date('Ymd'), $this->filename($file))) {
return [
'url' => Storage::url($path),
];
}
throw new RuntimeException('上传失败,请重试');
}
protected function filename(UploadedFile $file): string
{
$hash = Str::random(40);
$extension = '';
if ($originalExtension = $file->getClientOriginalExtension()) {
$extension = '.'.$originalExtension;
} elseif ($guessExtension = $this->guessExtension()) {
$extension = '.'.$guessExtension;
}
return $hash.$extension;
}
}