CRM/webman/app/controller/UploadController.php
2025-03-14 15:49:54 +08:00

98 lines
2.9 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\controller;
//use support\Request;
//use support\Log;
//use Webman\Http\Response;
use app\util\Util;
use support\Log;
use support\Request;
class UploadController
{
// 允许的文件类型
protected $allowedMimeTypes = [
'image/jpeg',
'image/jpg',
'image/png',
'image/gif',
'application/pdf',
'text/plain'
];
// 最大文件大小5MB
protected $maxFileSize = 5 * 1024 * 1024;
public function upload(Request $request): \support\Response
{
try {
// 获取上传的文件(支持多文件)
$files = $request->file('files');
// 如果没有文件上传
if (!$files) {
throw new \Exception('未上传任何文件');
}
// 单文件转换为数组统一处理
if (!is_array($files)) {
$files = [$files];
}
$result = [];
foreach ($files as $file) {
// 检查文件是否上传成功
if (!$file->isValid()) {
throw new \Exception($file->getUploadErrorMessage());
}
// 校验文件类型
if (!in_array($file->getUploadMineType(), $this->allowedMimeTypes)) {
throw new \Exception('不支持的文件类型: ' . $file->getUploadMineType());
}
// 校验文件大小
$fileSize = $file->getSize();
if ($fileSize > $this->maxFileSize) {
throw new \Exception('文件大小超过限制');
}
// 生成唯一文件名(防止覆盖)
$filename = uniqid() . '.' . $file->getUploadExtension();
// 保存路径例如runtime/uploads/202310
$savePath = runtime_path('uploads/' . date('Ym/d'));
if (!is_dir($savePath)) {
mkdir($savePath, 0755, true);
}
// 移动文件到目标路径
$file->move($savePath . '/' . $filename);
// 记录上传信息
Log::info('文件上传成功', [
'original_name' => $file->getUploadName(),
'saved_path' => $savePath . '/' . $filename,
'size' => $fileSize
]);
$result[] = [
'original_name' => $file->getUploadName(),
'saved_name' => $filename,
'path' => 'uploads/' . date('Ym') . '/' . $filename,
'size' => $fileSize,
'mime_type' => $file->getUploadMineType()
];
}
return Util::success($result,'上传成功');
} catch (\Throwable $e) {
Log::error('文件上传失败: ' . $e->getMessage());
return Util::fail([],$e->getMessage());
}
}
}