2016-09-25 4 views

ответ

5

Учитывая JAX-RS ресурсов, как:

@Produces({MediaType.APPLICATION_JSON}) 
@Consumes({MediaType.APPLICATION_JSON}) 
@Path("/myresource") 
public class MyResource { 

    @Inject 
    MyFacade myFacade; 

    @POST 
    @Path("/download") 
    @Produces({"application/zip"}) 
    public Response download(@NotNull Request req) { 
     byte[] zipFileContent = myFacade.download(req); 
     return Response 
      .ok(zipFileContent) 
      .type("application/zip") 
      .header("Content-Disposition", "attachment; filename = \"project.zip\"") 
      .build(); 
    } 
} 

Для того, чтобы потреблять и обслуживать файл конечному пользователю с помощью приложения Angular2, мы можем использовать услуги как:

...//other import statements 
import fileSaver = require("file-saver"); 

@Injectable() 
export class AngularService { 

    constructor(private http: Http) { 
    } 

    download(model: MyModel) { 
     this.http.post(BASE_URL + "myresource/download", JSON.stringify(model), { 
      method: RequestMethod.Post, 
      responseType: ResponseContentType.Blob, 
      headers: new Headers({'Content-type': 'application/json'}) 
     }).subscribe(
      (response) => { 
       var blob = new Blob([response.blob()], {type: 'application/zip'}); 
       var filename = 'file.zip'; 
       fileSaver.saveAs(blob, filename); 
     } 
    ); 
} 

для того чтобы это работало fileSaver должны быть импортированы в package.json как:

"dependencies": { 
    // all angular2 dependencies... 
    "file-saver": "1.3.2" 
}, 

И эта услуга теперь может быть введена на любом компоненте, который требует доступа к методу download