Как построить тело ответа для InputStream, который имеет файл листа Excel? - PullRequest
1 голос
/ 09 июля 2019

Я пишу API get для получения файла листа Excel, хранящегося в src / main / resources.

InputStream содержит содержимое файла Excel (формат xlsm).Но ответ содержит поврежденные данные.

@GetMapping("/downloadTemplate")
public ResponseEntity<?> downloadTemplate() throws IOException {
    String fn = "filename";

    try {
        File file = new File(getClass().getClassLoader().getResource(fn).getFile());
        InputStreamSource iss = new FileSystemResource(file);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE)
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename= SimpleStandardTemplate.xlsm")
                .body(IOUtils.toByteArray(iss.getInputStream()));
    } catch (Exception e) {
        log.error("An error occurred while trying to downloadTemplate: {}", e);
        throw new ApiException(ApiErrorCode.DEFAULT_410, "Error while downloading");
    }
}

Похоже, что в этой строке есть проблема "body (IOUtils.toByteArray (iss.getInputStream ()));",Есть ли альтернативный способ?Иначе, в чем может быть проблема?

Редактировать: Я думаю, что проблема с длиной контента.

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Попробуйте, протестировано с пружинной загрузкой 1.5.6

@GetMapping("/export")
  public ResponseEntity<Resource> download() throws IOException {
    String fileName ="<file-path>";
    Resource resource = new FileSystemResource(fileName);
    return ResponseEntity.ok()
        .contentType(MediaType.parseMediaType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
        .body(resource);
  }
0 голосов
/ 09 июля 2019

Одна потенциальная проблема заключается в том, что ваш исходный файл не является файлом xlsm. Например, Excel не позволяет открывать обычный файл xlsx в режиме макросов. Пожалуйста, проверьте дважды.

0 голосов
/ 09 июля 2019

Я думаю, что ваш тип MIME неправильный, См. Это для типов Excel MIME , я изменил способ отправки файла, используя Spring's FileSystemResource

@GetMapping(value = "/downloadTemplate", produces = "application/vnd.ms-excel.sheet.macroEnabled.12")
public FileSystemResource downloadTemplate(HttpServletResponse response) throws IOException {
    String fn = "filename";
    File file = new File(getClass().getClassLoader().getResource(fn).getFile()); 
    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename= SimpleStandardTemplate.xlsm");
    return new FileSystemResource(file); // You could directly pass the absolute path of the file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...