2017-04-17 282 views
3

我试图通过调用Spring REST端点来下载Reactjs中的Excel文件,但我遇到了损坏文件的问题。React excel文件下载损坏

阵营称...

getFile(){ 
    axios.get('get/download') 
     .then((response) => { 
      var blob = new Blob([response.data], {type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); 
      filesaver.saveAs(blob, "excel.xlsx"); 
     }); 
} 

春季控制器....

@RequestMapping(value = "/download", method = RequestMethod.GET) 
    public void downloadExcelFile(final HttpServletResponse response) throws IOException { 
     response.setHeader("Content-Encoding", "UTF-8"); 
     response.setHeader("Content-Disposition", "attachment; filename="file.xlsx"); 
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

     final File xls = service.createExcelFile(response); 

     final FileInputStream in = new FileInputStream(xls); 
     final OutputStream out = response.getOutputStream(); 

     final byte[] buffer = new byte[8192]; 
     int length; 

     while ((length = in.read(buffer)) > 0) { 
      out.write(buffer, 0, length); 
     } 
     in.close(); 
     out.close(); 
    } 

服务...

public File createExcelFile(final HttpServletResponse response) { 
    XSSFWorkbook xssfWorkbook = null; 
    final File xls = new File("excel.xlsx"); 
     try { 
      final FileOutputStream fos = new FileOutputStream(xls); 

      xssfWorkbook = new XSSFWorkbook(); 
      //setup excel file... 
      xssfWorkbook.write(fos); 
      xssfWorkbook.close(); 
     } 
     catch (final Exception e) { 
      LOGGER.error(String.format("Something went wrong")); 
     } 
    return xls; 
} 

当我执行上面的代码,我得到一个excel文件ok..but看在response.data看起来像...

"PKs��J_rels/.rels���j�0��}↵�{㴃1F�^Ơ�2��l%1I,c�[� 

打开文件我得到...由于数据不可读,无法打开文件。打开该文件在服务器上创建是确定

任何想法表示欢迎

干杯

+0

'new blob([response],'?(我不确定w所编码的数据在“数据”字段中) –

+0

面临类似的问题。这有什么好运? –

回答

2

你只需要响应类型添加到爱可信要求:

responseType: 'arraybuffer' 

在下面的函数下载我的应用程序excel文件:

function exportIssues() { 
    axios.get('/issues/export', { responseType: 'arraybuffer' }) 
    .then((response) => { 
     var blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); 
     fileSaver.saveAs(blob, 'fixi.xlsx'); 
    }); 
}