实现 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(); } 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(); // 3. 保存文件到本地存储(storage/topic 目录) $saveName = Filesystem::disk('public')->putFile('images', $file); return json([ 'code' => 200, 'msg' => '上传成功', 'url' => '/storage/' . $saveName ]); } catch (ValidateException $e) { // 验证失败异常捕获 return json(); } catch (\Exception $e) { // 系统错误异常捕获 return json(); } } } 三、 生产环境的优化建议 在实际生产环境中,单次上传 50MB 的物理文件会极大消耗服务器带宽与内存,建议采取以下优化手段 前端分片上传:利用 JavaScript (如 WebUploader 或 Plupload) 将 50MB 图片切分成 2MB 的小块并发上传,后端接收后再进行合并,配合 TP8 路由可以实现断点续传。 直传云存储:通过后端生成签名,让前端直接将 50MB 图片上传至阿里云 OSS、腾讯云 COS 或七牛云,完全不占用 Web 服务器的带宽。