当前位置: 首页 > 面试题库 >

使用Angular 6和Spring Rest API下载文件

简俊楚
2023-03-14
问题内容

我使用angular 6从rest api下载文件时遇到问题

后端方法

  @RequestMapping(value = "/print/{id}")
    public ResponseEntity<byte[]> generateReport(@PathVariable("id") long id_project){
        Map<String, Object> mapper = new HashMap<String, Object>();
        byte[] content =  exportService.export(mapper, ReportUtils.testReport, ReportUtils.FileFormat.PDF.toString());
        return new ResponseEntity<>(content, Utils.getPDFHeaders("Situation_test.pdf"), HttpStatus.OK);
    }

Mathod getHeader

public static HttpHeaders getPDFHeaders(String fileName) {
    HttpHeaders head = new HttpHeaders();
    head.setContentType(MediaType.parseMediaType("application/pdf"));
    head.add("content-disposition", "attachment; filename=" + fileName);
    head.setContentDispositionFormData(fileName, fileName);
    head.setCacheControl("must-revalidate, post-check=0, pre-check=0");
    return head;
}

我的角度服务

download(url: string): any {
    let headers = new HttpHeaders();
    headers = headers.append('Authorization', 'Bearer ' + this.getToken());
    this.http.get(this.API_URL + url, {headers: headers}).subscribe((res) => {
      const file = new Blob([res], {
        type: 'application/pdf',
      });
      const a = document.createElement('a');
      a.href = this.API_URL + (<any>res)._body;
      a.target = '_blank';
      document.body.appendChild(a);
      a.click();
      return res;
    }, error => {
      let alert: any = {
        title: 'Notify Title',
        body: 'Notify Body',
      };
      alert.body = error.error.message || JSON.stringify(error.error);
      alert.title = error.error.error;
      alert = this.alertService.handleError(error);
      alert.position = 'rightTop';
      console.log(error);
      this.alertService.notifyError(alert);
      return error;
    });
  }

我已经使用PostMan尝试了我的API,它的单词完美,但是在Angular中,它给了我这个错误

HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:8080/api/projects/print/1", ok: false, …}
error: {error: SyntaxError: Unexpected token % in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttp…, text: "%PDF-1.4↵%����↵3 0 obj↵<</Filter/FlateDecode/Lengt…25f1>]/Root 8 0 R/Size 10>>↵startxref↵1049↵%%EOF↵"}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure during parsing for http://localhost:8080/api/projects/print/1"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:8080/api/projects/print/1"

问题答案:

尝试将内容类型添加到您的请求标头中。您可以尝试使用以下示例:

let headers = new Headers({'Content-Type': 'application/pdf', 'Accept': 'application/pdf'});


 类似资料:
  • 嗨,可以通过传递列表作为参数从服务器下载文件吗 用RestyGWT和Jersey 1.7? 在服务器端,我有以下web服务 当我在浏览器中键入localhost:8080/Url/download时,它可以工作,但我如何使用Resty Gwt或通过窗口下载文件呢。open()? 我想使用POST not GET,这样我可以传递一个可序列化对象的列表,例如:列表文件。 我尝试在客户端使用RestyG

  • 问题内容: 我正在尝试使用asyncTask下载文件,但无法正常工作,没有错误消息或什么都没有,只是不下载文件…我尝试了所有操作,但似乎并没有输入…任何人都知道可以是问题吗?我在手机上测试过,网址也可以。 问题答案: 我只运行了您的代码,它对我来说很好用。该图像已下载到sdcard。 请注意,请确保在AndroidManifest.xml中设置了以下权限: 这是我得到的日志(请注意,我添加了):

  • 问题内容: 我编写了一些代码来下载我所做的网络广播的一集。它获取剧集的URL,并获取保存它的位置。但是,它最多只能下载16MB,然后自动取消。我不完全确定要增加此值需要更改什么值。是否可以,有人可以指出正确的方向吗?谢谢! 下载代码: 问题答案: 快速查看transferFrom的文档: 好。 计数的值1 << 24(来自原始问题)等于16M 我想这就是您的问题的答案:-)

  • 问题内容: 我需要提供下载文件的链接,任何用户都必须隐藏该链接并且可以访问该链接,这是我的代码,没有任何错误,但是我什至无法打开下载对话框: 模板 脚本文件 问题答案: 首先,您不能“隐藏/不公开”基于Web的技术(HTML / CSS / JavaScript)应用程序中的链接。下载是由客户端处理的,因此Download / Link-URL必须是公共的。您可以尝试使用后端执行的编程语言(例如“

  • 我想做的是用httpclient下载一个文件。目前我的代码如下。 我的下载URL如下所示:http://example.com/file/afz938f348dfa3 正如你可以看到没有扩展名的文件(至少在网址)然而,当我去一个正常的浏览器网址,它下载文件asdasdaasda.txt或asdasdasdsd.pdf(名称是不同的url和extenstion并不总是相同的,取决于我试图下载什么)。

  • 我有一个CSV文件的URL,我可以在浏览器中下载并打开该文件,而不会出现问题。 我正在尝试使用电源外壳下载此文件,但没有成功。我尝试使用,和使用web命令对象,但没有运气。