Spring Boot中自动识别LONGBLOB存储文件类型并设置MediaType实现下载
自动检测文件类型并设置对应MediaType的简便实现方法
你当前已经实现了固定类型(PDF/JPEG)的文件下载接口,想要实现自动根据文件内容或元数据匹配MediaType的话,有两种非常简便的方案:
方案一:利用Spring自带的MediaTypeFactory(无需额外依赖)
Spring框架自带的MediaTypeFactory类可以通过文件的字节头信息(文件签名)自动识别媒体类型,完全不需要依赖第三方库。直接基于现有字节数组即可实现检测:
public ResponseEntity<byte[]> getSupportDoc(@PathVariable String code) throws Exception { byte[] fileBytes = myService.findDocByCode(code).getFile(); // 从字节数组的前几个字节检测媒体类型 MediaType mediaType = MediaTypeFactory.getMediaType(new ByteArrayResource(fileBytes)) .orElse(MediaType.APPLICATION_OCTET_STREAM); // 兜底默认二进制流类型 HttpHeaders headers = new HttpHeaders(); headers.setContentType(mediaType); headers.setContentLength(fileBytes.length); return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); }
- 原理:
ByteArrayResource包装字节数组后,MediaTypeFactory会读取文件的特征字节(比如PDF的%PDF-、JPEG的FF D8 FF)匹配对应MediaType - 兜底逻辑:如果无法识别类型,默认返回二进制流类型,浏览器会触发下载操作
方案二:结合存储的文件名/类型元数据(更高效)
如果你的文件存储时同步记录了原始文件名或文件类型标记(比如上传时保存fileName字段),直接通过文件名后缀匹配会更高效:
假设文件实体类包含fileName字段:
public ResponseEntity<byte[]> getSupportDoc(@PathVariable String code) throws Exception { YourDocEntity doc = myService.findDocByCode(code); byte[] fileBytes = doc.getFile(); String fileName = doc.getFileName(); // 通过文件名后缀获取MediaType MediaType mediaType = MediaTypeFactory.getMediaType(fileName) .orElse(MediaType.APPLICATION_OCTET_STREAM); HttpHeaders headers = new HttpHeaders(); headers.setContentType(mediaType); headers.setContentLength(fileBytes.length); // 可选:设置下载时的显示文件名 headers.setContentDisposition(ContentDisposition.attachment().filename(fileName).build()); return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); }
- 优势:无需解析字节数组,直接通过后缀匹配,性能更优
- 补充:如果需要在线预览而非强制下载,可将
attachment()替换为inline()
这两种方案都是Spring生态内的原生实现,不需要引入额外依赖,比手动判断文件头或使用第三方库的方式更简便可靠。
内容的提问来源于stack exchange,提问作者HamzaDevXX
相关产品推荐
相关产品推荐

