Как загрузить zip-файл, открытый ресурсом JAX-RS, и подавать его пользователю с окончанием Angular2?Как использовать JAX-RS и Angular 2+ для загрузки zip-файла
0
A
ответ
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