实现 50MB 超大图片上传
如何在 ThinkPHP 8 中安全实现 50MB 超大图片
上传在现代 Web 开发中,处理 50MB 级别的超大图片(如高清设计原图、医疗医学影像等)是一项常见的需求。由于默认环境下服务器和框架都有严格的文件大小限制,直接上传会导致失败。本文将介绍如何在 ThinkPHP 8 (TP8) 中安全、稳定地实现 50MB 图片的上传。
一、 突破基础环境限制
大文件上传的第一步是调整服务器和 PHP 的基础配置,否则请求在到达 ThinkPHP 之前就会被拦截。
- 修改 php.ini 配置
upload_max_filesize = 50M
post_max_size = 55M
memory_limit = 256M
max_execution_time = 300
提示:post_max_size 必须大于 upload_max_filesize,并适当调大超时时间
二、 ThinkPHP 8 后端代码实现
在 TP8 中,建议使用内置的验证器(Validate)来对图片的大小和后缀进行严格校验,确保系统安全。
<?php
namespace app\controller;
use app\BaseController;
use think\exception\ValidateException;
use think\facade\Filesystem;
class UploadController extends BaseController
{
public function uploadImage()
{
// 1. 获取上传的文件
$file = $this->request->file('image');
if (!$file) {
return json(['code' => 400, 'msg' => '请选择上传文件']);
}
try {
// 2. 严格验证:限制 50MB 仅允许常见图片格式
validate([
'image' => [
'fileSize' => 55 * 1024 * 1024,
'fileExt' => 'jpg,jpeg,png,gif,webp',
'fileMime' => 'image/jpeg,image/png,image/gif,image/webp'
]
])->check(['image' => $file]);
// 3. 保存文件到本地存储(storage/topic 目录)
$saveName = Filesystem::disk('public')->putFile('images', $file);
return json([
'code' => 200,
'msg' => '上传成功',
'url' => '/storage/' . $saveName
]);
} catch (ValidateException $e) {
// 验证失败异常捕获
return json(['code' => 400, 'msg' => $e->getError()]);
} catch (\Exception $e) {
// 系统错误异常捕获
return json(['code' => 500, 'msg' => '服务器内部错误:' . $e->getMessage()]);
}
}
}
三、 生产环境的优化建议
在实际生产环境中,单次上传 50MB 的物理文件会极大消耗服务器带宽与内存,建议采取以下优化手段
前端分片上传:利用 JavaScript (如 WebUploader 或 Plupload) 将 50MB 图片切分成 2MB 的小块并发上传,后端接收后再进行合并,配合 TP8 路由可以实现断点续传。
直传云存储:通过后端生成签名,让前端直接将 50MB 图片上传至阿里云 OSS、腾讯云 COS 或七牛云,完全不占用 Web 服务器的带宽。
分类:
Vue
标签:
版权申明
本文系作者 @十三 原创发布在实现 50MB 超大图片上传。未经许可,禁止转载。
全部评论