我正在创建一个Web应用程序,允许用户在完成某些处理后下载报告(Excel文件)。 当前,我有我的服务器端应用程序-java-创建excel报告,并通过控制器中的servlet输出流将其发送。我的客户端代码-java / javascript-调用服务器端端点,并使用IOUtils.copy创建文件
但是,excel表示下载的文件已损坏。
我对前端和客户端编程还很陌生,所以我不确定自己做错了什么。我是按照现有的pdf文件下载流程建模的,该流程可以正常工作,因此不确定我的问题是什么。
这是一个代码示例:
服务器端: 控制器
@RequestMapping(value = "/download/report",
method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public FileBulkUploadReportResponse getFileBulkOutputData(@RequestParam("Id") Integer Id, HttpServletResponse servletResponse) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
FileUtil.createExcel(input, byteArrayOutputStream);
response.setFilename("singlemerchant2_report.xlsx");
servletResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
servletResponse.setHeader("Content-Disposition", "attachment; filename=" + "\"" + response.getFilename() + "\"");
byteArrayOutputStream.writeTo(servletResponse.getOutputStream());
servletResponse.flushBuffer();
return response;
} catch (IOException e){
}
return null;
}
createExcel()的代码段
try {
Workbook workbook = new XSSFWorkbook();
//create sheet and co
workbook.write(outputStream);
} catch(Exception e){
logger.error("Unable to write to Excel file");
logger.error(LogUtil.getExceptionMessage(e));
}
客户端: 下载报告按钮
htmlString += '<a class="btn btn-primary" href="/portal/api/reports/id/'+row.id+'/name/'+row.name+'" target"_blank"> Report</a>';
href端点详细信息:
@RequestMapping(method = RequestMethod.GET,value={"/reports/id/{Id}/name/{Name}"})
public void getBulkUploadReport(HttpServletResponse response, @PathVariable int fileId, @PathVariable String fileName) throws IOException {
String name = fileName"_report.xlsx";
response.setHeader("Content-Disposition", "attachment; filename=" + "\"" + name + "\"");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
service.downloadReport(fileId, response.getOutputStream());
response.flushBuffer();
return;
}
下载报告详细信息
public void downloadReport(int Id, OutputStream outputStream) {
try {
URI uri = UriComponentsBuilder
.fromUriString(serverSideUri)
.path("/download/report")
.queryParam("Id", d)
.build()
.toUri();
HttpURLConnection myURLConnection = (HttpURLConnection) uri.toURL().openConnection();
myURLConnection.setRequestMethod("GET");
myURLConnection.setRequestProperty("Content-Type", "application/json");
IOUtils.copy(myURLConnection.getInputStream(), outputStream);
} catch (Exception ex) {
logger.error(ex.getMessage());
}
}
谁能指出我做错了什么,我猜是它围绕着流,byteArrayOutputStream和servletOutputStream,但是我不确定。
我也愿意就实现目标达成更好的想法