我想下载一个带有Spring Boot:的文件
@GetMapping("/downloadById.{id}/{fileName}")
@ResponseBody
public ResponseEntity<Object> downloadById(@PathVariable("id") int id, HttpServletResponse response) {
final MultipartFile file = fileUtils.getMultiPartFileById(id, fileName, mimeType);
response.setContentType(mimeType);
response.setContentLength(file.getBytes().length);
response.setHeader("Content-Disposition", "inline; filename="" + fileName + """);
FileCopyUtils.copy(file.getBytes(), response.getOutputStream());
return new ResponseEntity<>(response.toString(), HttpStatus.ACCEPTED);
}
通过这种方法,我一直得到一个例外:
org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.lang.String] with preset Content-Type 'application/vnd.oasis.opendocument.text'
而内容类型是我设置的。
将MimeType设置为@GetMapping
超出了作用域,因为我有多种不同的文件类型。因此,我直接在contentType
中设置它。哪个或多或少有效(除了例外://(
Q: 如何告诉SpringBootNOT使用String
转换器,并使用设置的MimeType处理响应?
我不能100%确定,但return new ResponseEntity<>(response.toString(), HttpStatus.ACCEPTED);
中的response.toString()
可能会导致问题。
试试类似的东西:
public ResponseEntity<byte[]> downloadById(...){
...
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename="" + file.getFilename() + """)
.contentType(mimeType)
.body(file.getBytes());
}
@Puce的假设是正确的,即转换为String
是错误的。基本上我需要返回StreamingResponseBody
。整个代码看起来像
@GetMapping("/downloadById.{id}/{fileName}")
@ResponseBody
public ResponseEntity<StreamingResponseBody> downloadById(@PathVariable("id") int id) {
final MultipartFile file = fileUtils.getMultiPartFileById(id, fileName, mimeType);
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(mimeType));
headers.setContentLength(file.getBytes().length);
headers.setContentDisposition(ContentDisposition.builder("inline").filename(fileName).build());
final StreamingResponseBody ret = out -> {
out.write(file.getBytes());
};
return new ResponseEntity<>(ret, headers, HttpStatus.OK);
}
这种方法的主要优点是,在出现异常的情况下,我也可以返回常规的String
。