SpringBoot+Thymeleaf视频上传异常:仅支持MP4不兼容MKV
解决Chrome中Thymeleaf视频上传仅支持MP4不支持MKV的问题
我之前也碰到过一模一样的情况,Chrome对accept="video/*"的处理并不像我们预期的那样覆盖所有视频格式。这是因为Chrome的文件选择器在解析video/*时,只会匹配它内置识别的标准视频MIME类型,而MKV对应的video/x-matroska并没有被包含在这个默认匹配列表里,导致MKV文件直接被过滤掉了。
解决方案1:明确指定支持的视频MIME类型
直接在accept属性里列出所有你需要支持的视频格式对应的MIME类型,这样Chrome就能正确识别并允许选择MKV文件了。修改后的文件输入框代码如下:
<input type="file" id="video" name="files" accept="video/mp4,video/x-matroska,video/avi,video/mpeg,video/webm,video/quicktime">
这里我列出了常见的视频格式MIME类型,你可以根据自己的业务需求增减。
解决方案2:服务器端加强校验
前端的accept属性只是客户端的友好过滤,完全不能作为安全校验的依据——恶意用户很容易通过技术手段绕过这个限制。所以一定要在SpringBoot后端对上传的文件做双重校验:
- 校验文件扩展名:判断文件名是否以
.mkv、.mp4等允许的后缀结尾 - 校验文件的实际MIME类型:通过文件流的魔数判断真实类型,避免伪造扩展名的情况
示例后端校验代码片段(基于Spring MVC的MultipartFile):
@PostMapping("/adduser.html") public String handleVideoUpload(@ModelAttribute User user, @RequestParam("files") MultipartFile file) throws IOException { // 校验文件扩展名 String originalFilename = file.getOriginalFilename(); assert originalFilename != null; String extension = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); List<String> allowedExtensions = Arrays.asList(".mp4", ".mkv", ".avi", ".webm"); if (!allowedExtensions.contains(extension)) { // 处理不允许的文件类型,比如返回错误页面或提示 return "upload-error"; } // 校验实际MIME类型(可选但更安全) String contentType = file.getContentType(); List<String> allowedContentTypes = Arrays.asList("video/mp4", "video/x-matroska", "video/avi", "video/webm"); if (!allowedContentTypes.contains(contentType)) { // 处理MIME类型不匹配的情况 return "upload-error"; } // 后续的文件保存或业务逻辑 return "upload-success"; }
额外提示
如果还是存在问题,建议把Chrome升级到最新稳定版(你的v87版本比较老旧,新版本对MIME类型的支持更完善),不过上面的解决方案在旧版本中也能正常生效。
内容的提问来源于stack exchange,提问作者en Lopes
相关产品推荐
相关产品推荐

