- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Java-Angular 2 下载 PDF 文件。我已经使用 Postman
测试了我的 Java 代码,它工作得很好,但是当我在客户端接收数据时,我得到了:
如果我使用FileSaver
,我会得到一个空文件。
这是 Java Controller 代码:
@RequestMapping(value = { "/gestionnaire/documents/file/{id}" }, method = RequestMethod.GET,
produces = {"image/jpeg","image/png", "application/json" , "text/plain" , "application/pdf"})
public ResponseEntity<InputStreamResource> getFile(HttpServletRequest request , @PathVariable Long id) throws JSONException, IOException {
Document document = documentService.findById(id);
File file = new File(document.getChemin());
String fileName = file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf("\\")+1);
InputStream input = new FileInputStream(file);
HttpHeaders headers = new HttpHeaders();
String extension = fileName.substring(fileName.lastIndexOf(".")+1);
switch (extension) {
case "pdf": headers.setContentType(MediaType.parseMediaType("application/pdf "));
break;
case "txt": headers.setContentType(MediaType.parseMediaType("text/plain "));
break;
case "png": headers.setContentType(MediaType.parseMediaType("image/png "));
break;
case "jpeg": headers.setContentType(MediaType.parseMediaType("image/jpeg "));
break;
default: headers.setContentType(MediaType.parseMediaType(""));
break;
}
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT");
headers.add("Access-Control-Allow-Headers", "Content-Type");
headers.add("Content-Disposition",
"attachment;filename=\""+URLEncoder.encode(fileName, "UTF-8") + "\"
");
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.setContentLength(file.length());
ResponseEntity<InputStreamResource> response = new
ResponseEntity<InputStreamResource>(
new InputStreamResource(input), headers, HttpStatus.OK);
return response;
}
这是组件方法:
openPopup(document : Document , size : string, title : string) {
this.documentService.getDocumentFile(document)
.toPromise().then((response : any) =>
{
let parts = document.chemin.split(".") ;
if(parts[parts.length -1] === "txt"){
var file = new Blob([response.text()], {type:
'text/plain;charset=utf-8'});
FileSaver.saveAs(file, 'fileDowloaded');
this.popup.open(NguiMessagePopupComponent, {
classNames: size,//large , medium , small
title: title,
message: response.text(),
buttons: {
OK: () => {
this.message = "Ok button is pressed";
},
CANCEL: () => {
this.message = "Cancel button is pressed";
this.popup.close();}
} });
}
if(parts[parts.length -1] === "pdf"){
var file = new Blob([response.arrayBuffer()], {type:
'application/pdf;charset=UTF-8'});
FileSaver.saveAs(file, 'fileDowloaded');
this.popup.open(NguiMessagePopupComponent, {
classNames: size,
title: title,
message: response.text(),
buttons: {
OK: () => {
this.message = "Ok button is pressed";
},
CANCEL: () => {
this.message = "Cancel button is pressed";
this.popup.close();}
} });
}
}
).catch(err=>"can't download file");
}
这是服务方法:
getDocumentFile(document : Document){
let headers = new Headers();
let responseType : ResponseContentType.ArrayBuffer ;
let options = new RequestOptions({ headers : headers ,withCredentials:
true , responseType});
return this.http.get(super.getBaseUrl()
+"gestionnaire/documents/file/"+document.id,options)
}
我使用了 response.blob()
而不是 response.arrayBuffer()
,但它仍然无法正常工作。
最佳答案
我遇到了类似的问题,我已经解决了:
为我服务
private options = new RequestOptions({ headers: new Headers({ 'Content-Type': 'application/pdf' }) , responseType : ResponseContentType.ArrayBuffer });
...
generatePDF( idJour: number): any {
return this.http.get(`${this.resourceUrl}/presenceCantinePDF/${idJour}`, this.options
).map((res: any) => {
return res;
});
}
我称之为:
generatePDF() {
this.presenceSyntheseService.generatePDF(774).subscribe((res) => {
console.log(res);
const blob = new Blob([res._body], { type: 'application/pdf' });
// window.open(URL.createObjectURL(blob));
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, 'testss.pdf');
} else {
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'response.pdf';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
});
}
我的Java代码:
@GetMapping(value = "/presence-synthese/presenceCantinePDF/{idJour}", produces = MediaType.APPLICATION_PDF_VALUE)
public @ResponseBody ResponseEntity<InputStreamResource> getPDF(@PathVariable Long idJour) throws IOException {
ByteArrayInputStream stream = presenceSyntheseService.generatePDF(idJour);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "inline; filename=presenceCantine.pdf");
//headers.add("Content-Disposition", "attachment; filename=ismael.pdf");
return ResponseEntity
.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_PDF)
.body(new InputStreamResource(stream));
}
祝你好运
关于java - Angular 2 : PDF file download,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44724076/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!