簡體   English   中英

從Rest WebServices Spring下載文件

[英]Download file from rest webservices spring

我正在嘗試下載任何調用我的其余Web服務的文件。 我將spring + jersey用於Web服務,並將Angular 2用於前端。 因此,當我在前面進行叮當響時,Web服務會獲取我的文件,但未顯示下載該文件的窗口。

我的其余API:

    @POST
    @Path("/download")
    @ApiOperation(value = "Download")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response downloadFile(@ApiParam(value = "File", required = true) String filePath) {
        File file = new File("/webapps/pdf/upload/msg/1/gest.PNG");
        Response.ResponseBuilder response = Response.ok((Object) file);
        try {
            String contentType = Files.probeContentType(file.toPath());
            response.header("Content-Disposition", "attachment; filename="+file.getName());
            response.header("Content-Type", contentType);
            return response.build();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

我的Angular服務:

    downloadFile(path) {
      const headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded', 'Accept': '*'});
      const options = new RequestOptions({headers: headers});

      options.responseType = ResponseContentType.Blob;
      return this.http.post(apiUrl + "msg/download", path, options)
      .catch(this.handleError);
  }

我的Angular組件:

  downloadFile(documentPath) {
    this.msgService.downloadFile(documentPath).subscribe(response => {
      var contentType = response.headers('Content-Type');
      let url = window.URL.createObjectURL(new Blob([response._body], {type: contentType}));
      window.open(url);    
      });
  }

HTML:

<figure class="ui-g-12 " *ngFor="let document of msg.documents_path" (click)="downloadFile(document)">
      <img  [src]="selectImageByExtension(document.split('.').pop().toLowerCase())"  />
      <figcaption>{{document.split('/').pop().toLowerCase()}}</figcaption>
</figure>

當我單擊我的figure我可以看到文件已正確獲取: 在此處輸入圖片說明

但是什么都沒有彈出。 我錯過了什么 ?

因此,對我而言唯一可行的解​​決方案是使用GET請求而不是POST將文件路徑作為pathparam傳遞。

REST API:

    @GET
    @Path("/download/{filePath}")

    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getdownloadFile(@PathParam("filePath") String filePath) {
        String path = null;

            byte [] barr = Base64.getDecoder().decode(filePath);
            path = new String(barr);
        File file = new File(path);
        try {
            String contentType = Files.probeContentType(file.toPath());

            Response.ResponseBuilder response = Response.ok((Object) file);
            response.header("Content-Disposition", "attachment; filename="+file.getName());
            response.header("Content-Type", contentType);
            response.header("Content-Length", file.length());
            return response.build();
        } catch (IOException e) {
            e.printStackTrace();
            return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
        }
    }

角度服務:

    downloadFile(path) {
    const headers = new Headers({'Content-Type': 'text/plain', 'Accept': '*'});
    const options = new RequestOptions({headers: headers});
    options.responseType = ResponseContentType.Blob;
    return this.http.get(apiUrl + "msg/download/"+btoa(path), options)
      .map(res => res)
      .catch(this.handleError);
  }

角組件:

  downloadFile(documentPath) {
    this.msgService.downloadFile(documentPath).subscribe(response => {
        let params = documentPath.split('/' );
        var blob = new Blob([response._body]);
        FileSaver.saveAs(blob, params[params.length-1]);
      });
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM