You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:54:05