Java服务器生成的Excel已从js / java客户端下载为已损坏,无法打开

时间:2018-08-22 16:22:34

标签: java excel google-chrome download outputstream

我正在创建一个Web应用程序,允许用户在完成某些处理后下载报告(Excel文件)。 当前,我有我的服务器端应用程序-java-创建excel报告,并通过控制器中的servlet输出流将其发送。我的客户端代码-java / javascript-调用服务器端端点,并使用IOUtils.copy创建文件

但是,excel表示下载的文件已损坏。

enter image description here

我对前端和客户端编程还很陌生,所以我不确定自己做错了什么。我是按照现有的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,但是我不确定。

我也愿意就实现目标达成更好的想法

0 个答案:

没有答案