Laravel视频上传iOS端出现mime-type为application/octet-stream问题求解
解决方案
根因说明
- iOS端发起上传请求时,未正确为文件参数设置原始文件名和对应的MIME类型,导致PHP接收时只拿到临时文件名,默认赋值MIME为
application/octet-stream(通用二进制流类型) - 你当前依赖客户端传入的
getClientOriginalExtension()方法本身也存在安全风险:客户端可以伪造文件扩展名,恶意上传可执行文件
后端修复方案(推荐,不受客户端传参影响)
核心逻辑是服务端主动读取文件实际内容判断真实MIME类型,再映射为对应扩展名,完全不依赖客户端传入的不可信参数:
修复后代码示例
use Illuminate\Support\Facades\File; $file = $request->file('file'); // 读取文件实际内容判断真实MIME,不受客户端传参影响 $realMimeType = $file->getMimeType(); // 根据真实MIME映射正确扩展名,Laravel底层已内置常见MIME和扩展名的映射关系 $ext = File::extension($realMimeType); // 兜底兼容极端情况,防止映射不到扩展名 if (empty($ext)) { // 可以根据业务允许的上传格式做兜底,比如只允许视频的话可以判断是视频类MIME就默认mov/mp4 $ext = str_starts_with($realMimeType, 'video/') ? 'mov' : 'bin'; } $size = $file->getSize(); $filename = Str::random(100) . date('his').'.'.$ext; $localVideo = Storage::disk('public')->put($filename, file_get_contents($file));
补充说明
- 如果遇到少见的MIME类型没有映射到正确扩展名,可以自己扩展MIME到扩展名的映射配置,在
config/filesystems.php里加自定义映射即可 - 建议额外加文件类型校验:只允许业务需要的视频MIME类型(比如
video/quicktime、video/mp4等),不符合的直接拒绝上传,避免恶意文件上传风险
可选的端侧修复方案(配合后端方案一起用更稳妥)
要求iOS开发同学调整上传逻辑,构造multipart/form-data请求的时候,给文件参数正确设置filename属性为视频的真实文件名,同时设置对应文件的Content-Type,修复后后端就能正常拿到客户端传入的原始文件名和MIME了。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

