Файл с именем «undefined» возвращается в ответ API, весенняя загрузка - PullRequest
0 голосов
/ 02 июля 2019

Я столкнулся со странной проблемой, я пытаюсь вернуть файл Excel (.xlsx) в ответ на конечную точку API, и возвращенный файл в порядке, за исключением того, что имя файла всегда отображается как «неопределенное».xlsx '.

API работает нормально в почтальоне (т.е. имя файла приходит как положено), но когда тот же API вызывается через браузер (т.е. мое приложение), имя возвращаемого файла будет «undefined.xlsx».».Файл в обоих приведенных выше случаях полностью в порядке, т.е. все данные, стили и т. Д. Соответствуют ожиданиям.

Оба заголовка "Content-disposition" и "Content-Type" также видны в заголовках ответа..

Пожалуйста, дайте мне знать, если что-то еще требуется от моего конца.

Большое спасибо.

Я пробовал следующие способы / способы отправки файла:

    @RequestMapping(value = "exportLogs/{deploymentId}")
    public ResponseEntity<byte[]> exportDeploymentLogs(@PathVariable String deploymentId) throws IOException {
        File workbook = myService.exportLogs(deploymentId);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Disposition", String.format("attachment; filename=%s.xlsx",
                Utils.getFileName(workbook.getName())));
        httpHeaders.add("Content-Type", "application/vnd.ms-excel");
        return new ResponseEntity<>(org.apache.commons.io.FileUtils.readFileToByteArray(workbook), httpHeaders, HttpStatus.OK);
    }

2.

    @RequestMapping(value = "exportLogs/{deploymentId}")
    public ResponseEntity<byte[]> exportDeploymentLogs(@PathVariable String deploymentId) throws IOException {
        File workbook = myService.exportLogs(deploymentId);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Disposition", String.format("attachment; filename=%s.xlsx",
                Utils.getFileName(workbook.getName())));
        httpHeaders.add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        return new ResponseEntity<>(org.apache.commons.io.FileUtils.readFileToByteArray(workbook), httpHeaders, HttpStatus.OK);
    }

3.

    @RequestMapping(value = "exportLogs/{deploymentId}")
    public Response exportDeploymentLogs(@PathVariable String deploymentId) throws IOException {
        File workbook = myService.exportLogs(deploymentId);
Response.ResponseBuilder responseBuilder = Response.ok(workbook);
        responseBuilder.header("Content-Disposition", String.format("attachment; filename=%s.xlsx",
                Utils.getFileName(workbook.getName())));
        responseBuilder.header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        return responseBuilder.build();
    }

4.

@POST
    @RequestMapping(value = "exportLogs2/{deploymentId}")
    public void exportDeploymentLogs2(@PathVariable String deploymentId,  HttpServletResponse response) throws IOException {
        File workbook = myService.exportLogs(deploymentId);
        response.setHeader("Content-disposition", "attachment; filename=" + Utils.getFileName(workbook.getName())+".xlsx");
        response.setContentType("application/vnd.ms-excel");
        IOUtils.copy(FileUtils.openInputStream(workbook), response.getOutputStream());
        response.flushBuffer();
    }

Код ->

Конечная точка API:

    @RequestMapping(value = "exportLogs/{deploymentId}")
    public ResponseEntity<byte[]> exportDeploymentLogs(@PathVariable String deploymentId) throws IOException {
        File workbook = myService.exportLogs(deploymentId);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Disposition", String.format("attachment; filename=%s.xlsx",
                Utils.getFileName(workbook.getName())));
        httpHeaders.add("Content-Type", "application/vnd.ms-excel");
        return new ResponseEntity<>(org.apache.commons.io.FileUtils.readFileToByteArray(workbook), httpHeaders, HttpStatus.OK);
    }

MyService:

public File exportLogs(String deploymentId){
  DeploymentDetail dt = deployService.getDeploymentById(deploymentId);
  XSSFWorkbook workbook = excelService.createExcel(dt);//which will create and update some data in file.
  try {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                workbook.write(byteArrayOutputStream);
                return renameFile(byteArrayOutputStream.toByteArray(), fileName);
            }catch (Exception e){
                LOGGER.info("Error occurred while writing into stream {}", e);
                return File.createTempFile("Error", "xlsx");
            }
}
/*Although I can send the byte[] of workbook directly but thought that * there might be some problem in the workbook because of which the name * of the workbook is not showing, that's why I am creating a temp file 
* with the requestedName and sending this file back.
*/
private File renameFile(byte[] workbook, String fileName) throws IOException {
        File file = File.createTempFile(fileName, "xlsx");
        FileUtils.writeByteArrayToFile(file, workbook);
        return file;
    }

Ожидается - допустимый файл с ожидаемым именем файла.Фактический вывод - действительный файл с именем «undefined.xlsx».

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