当我在SpringBoot中创建一个文件(我可以在桌面上获取包含数据的文件)时,我尝试将该文件发送到Angular2,但是当我的文件到达时,我在Angular2中得到NULL。
SpringBoot:
在这里,我打电话给SpringBOOT下载Excell。
@RequestMapping(method = RequestMethod.GET, path = "/{download}", produces = MediaType.APPLICATION_JSON_VALUE)
public MultipartFile download() {
MultipartFile myFile = null;
myFile = downloadExcell();
return myFile;
}
在此函数中,我创建了myExcell,我的excell创建成功,我可以在桌面上获取文件。
private MultipartFile downloadExcell() {
MultipartFile myFile = null;
String eyelash = "People";
try {
String filename = pathTempdownloadFile;
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(eyelash);
String [] header= {"YEAR","MONTH","NAME","SURNAME","TLF"} ;
HSSFRow rowhead = sheet.createRow((short) 0);
for (int i = 0; i < header.length; i++) {
cell = rowhead.createCell(cellnum);
cell.setCellValue(header[i]);
cellnum++;
}
FileOutputStream fileOut = new FileOutputStream(filename);
workbook.write(fileOut);
fileOut.close();
workbook.close();
} catch (Exception ex) {
System.out.println(ex);
}
return myFile;
}
现在我已经可以将fileOut分配给myFile
myFile = (MultipartFile) fileOut;
错误->
java.lang.ClassCastException: java.io.FileOutputStream cannot be cast to org.springframework.web.multipart.MultipartFile
最后,我在Angular2 myFile中得到了(false)。
Angular2->
downloadFile() {
this.service.downloadFile().subscribe(data => {
console.log("FILE", data);
});
}
downloadFile() {
const url = "http://localhost:8080/ml/download";
return this.http.get(url);
}
我需要将Excell的SpringBoot发送给Angular2,但是我没有找到如何做。 Ty
答案 0 :(得分:1)
您不应直接从Spring Boot发送文件。这会干扰服务器上的流量。我建议您将文件上传到任何静态文件托管(如S3)。然后将文件的URL发送到angular。让我们从S3角度获取它。
答案 1 :(得分:1)
如您所知,MultipartFile
和FileOutputStream
是无关的:从实例中可以看到,创建了输出流,并使用该输出流写入文件,而不是servlet响应,并且MultipartFile
通常用作请求参数,但不能用于响应。
根据您的要求,您可以将Excel文件直接写入Web请求输出流。但是,我认为最好先将其存储在文件系统中,然后再从那里提供服务。
为了访问响应,您可以将HttpServletResponse
注入控制器方法(Spring会注意正确填充此参数):
public void download(HttpServletResponse response)
还请注意,由于您仅使用void
参数,因此我将返回类型更改为response
。
存储文件后,您现在可以将其写入响应中。请记住,将适当的内容类型设置为响应的一部分,以便发出请求的客户端(例如浏览器,知道如何处理。
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-disposition", "attachment; filename=result.xlsx");
try (final InputStream is = new FileInputStream(filename)) {
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
} catch (Exception ex) {
// deal with error, e.g. response.setStatus(500) to signal an internal server error
}
请注意,我已经使用了Apache Commons IO库中的IOUtils.copy
。它只是将输入字节从FileInputStream
复制到响应OutputStream
,您也可以手动实现:
byte[] buffer = new byte[4096];
OutputStream os = response.getOutputStream();
for (long count = 0L; -1 != (n = is.read(buffer)); count += (long)n) {
os.write(buffer, 0, n);
}
还要注意,我指定了另一个标头Content-Disposition
。这为浏览器提供了有关如何处理接收到的文件的其他指导; attachment
通常会导致一个保存对话框,而inline
会生成文件的内联显示(例如,对于PDF来说很有趣)。浏览器将使用指定的文件名来存储文件。