简体   繁体   English

Angular2:从Rest Webservice下载文件

[英]Angular2: download file from Rest webservice

i have this JAVA webservice for download a file: 我有这个JAVA Web服务可以下载文件:

@Path("test")
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public javax.ws.rs.core.Response downloadFile() {
    File folder = new File("Myfolder");
    File file = new File(folder.getAbsolutePath() + "/" + "myFile.txt");

    return javax.ws.rs.core.Response.ok((Object) file).header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, HEAD, OPTIONS")
            .header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type, X-Codingpedia")
            .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"").build();
}

and i need to download it from my angular2 application. 我需要从我的angular2应用程序中下载它。 I've implement this service: 我已经实现了这项服务:

download():Observable<Response> {

    let params = new URLSearchParams();
    let requestOptions = new RequestOptions({
        headers: this.getHeaders2(),
        search: params
    });

    requestOptions.method=RequestMethod.Get;
    requestOptions.url ="myUrl";
    requestOptions.responseType = ResponseContentType.Blob;
    let request = new Request(requestOptions);
    return this.http.request(request);
  }

  private getHeaders2() {
     let headers = new Headers();
     headers.append('Content-Type', 'application/octet-stream');
     headers.append('responseType', 'arrayBuffer');
     return headers;
  }

ant this is how i call service on my component: ant这就是我在组件上调用服务的方式:

this.services.download().subscribe(
      response => {
          let file = response.blob();
          console.log(file.size + " bytes file downloaded. File type: ", file.type);
          var url =window.URL.createObjectURL(file);
          window.open(url);
      },
      error => console.log(JSON.stringify(error))
    );

but i obtain an error: 但我得到一个错误:

"Error: The request body isn't either a blob or an array buffer\n

what's wrong? 怎么了?

Try it this way: 尝试这种方式:

this.services.download().subscribe(response => {

       // create a new Blob by defining its content-type
       let file = new Blob([response.blob()], { type: 'application/octet-stream' }); 

       console.log(file.size + " bytes file downloaded. File type: ", file.type);
       var url =window.URL.createObjectURL(file);
       window.open(url);
   },
   error => console.log(JSON.stringify(error)

);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM