使用SpringBoot将文件发送到Angular2

时间:2018-07-19 08:08:56

标签: angular spring-boot

当我在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

2 个答案:

答案 0 :(得分:1)

您不应直接从Spring Boot发送文件。这会干扰服务器上的流量。我建议您将文件上传到任何静态文件托管(如S3)。然后将文件的URL发送到angular。让我们从S3角度获取它。

答案 1 :(得分:1)

如您所知,MultipartFileFileOutputStream是无关的:从实例中可以看到,创建了输出流,并使用该输出流写入文件,而不是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来说很有趣)。浏览器将使用指定的文件名来存储文件。