You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Concerns\EnsuresPublicDiskWritable;
use App\Http\Controllers\Concerns\StoresPublicUploadWithoutFileinfo;
use App\Http\Controllers\Controller;
use App\Models\WechatUser;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Throwable;
class H5UploadController extends Controller
{
use EnsuresPublicDiskWritable;
use StoresPublicUploadWithoutFileinfo;
public function store(Request $request): JsonResponse
{
$user = $request->user();
if (! $user instanceof WechatUser) {
abort(403, '仅微信用户可上传');
}
if ($early = $this->ensurePublicDiskReady()) {
return $early;
}
if (!$request->hasFile('file')) {
return response()->json(['message' => '未收到文件'], 422);
}
$uploaded = $request->file('file');
if (!$uploaded->isValid()) {
return response()->json(['message' => $uploaded->getErrorMessage()], 422);
}
$data = $request->validate([
// mimes 内部用 guessExtension(),依赖 fileinfoextensions 仅看客户端扩展名
'file' => ['required', 'file', 'max:5120', 'extensions:jpg,jpeg,png,gif,webp'],
]);
try {
$path = $this->storeUploadedFileAsUniqueName($data['file'], 'uploads/h5');
} catch (Throwable $e) {
report($e);
Log::error('h5_upload_putfile_failed', [
'message' => $e->getMessage(),
'public_path' => storage_path('app/public'),
]);
return response()->json([
'message' => '文件保存失败',
'detail' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
if ($path === false) {
Log::error('h5_upload_putfile_returned_false', [
'public_path' => storage_path('app/public'),
]);
return response()->json([
'message' => '文件保存失败(写入返回失败)',
'detail' => config('app.debug') ? 'Storage::putFileAs 返回 false' : null,
], 500);
}
$safePath = str_replace('\\', '/', $path);
return response()->json([
'url' => url('/storage/'.$safePath),
'path' => $path,
]);
}
}