Я столкнулся со странной проблемой, я пытаюсь вернуть файл 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».