SpringBoot: скачать файл Multipart с индивидуально установленным MimeType - PullRequest
1 голос
/ 30 апреля 2020

Я хочу скачать файл с 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'

, тогда как Content-Type является единственным Я установил.

Установка MimeType в @GetMapping выходит за рамки, поскольку у меня несколько разных типов файлов. Поэтому я установил его прямо в contentType. Что работает более или менее (за исключением исключения: - /)

В: Как заставить SpringBoot НЕ использовать конвертер String и просто обработать ответ с помощью установленного MimeType?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Я не уверен на 100%, но response.toString() в return new ResponseEntity<>(response.toString(), HttpStatus.ACCEPTED); может вызвать проблему.

Попробуйте что-то вроде:

public ResponseEntity<byte[]> downloadById(...){
    ...
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION,
                    "attachment; filename=\"" + file.getFilename() + "\"")
            .contentType(mimeType)
            .body(file.getBytes());
}
0 голосов
/ 04 мая 2020

Предположение от @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 в случае исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...