如何在Angular上创建下载文件服务?

时间:2019-01-30 09:05:28

标签: c# angular api download

我在.Net Core API中创建了一个控制器,以便创建一个带有软件包iTextSharp的文件并将pdf文件发送给用户。当我使用Swagger进行测试时,因为它已在项目中实现,因此效果很好,但是当我想在我的角度应用程序中使用控制器时,它就无法工作。

我的C#控制器:

[HttpPost("[Action]")]
public IActionResult CreateLicensePDF(License license) { 
    GenerateLicenseFIleService generateLicenseFIleService = new GenerateLicenseFIleService();
    byte[] abytes = generateLicenseFIleService.Generate(license);
    string fileName = license.Customer.CustomerNumber + "-" + license.Order.OrderNumber + ".pdf";
    return File(abytes, "application/pdf", fileName);
}

调用api网址以在我的angular应用程序中执行控制器的服务:

generateLicensePDF(license){
    return this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license);

}

单击按钮后,它将执行此功能以调用服务

onSubmit(){
    // get a license by id and it's return license's data
    this.licenseInfoService.getLicenseById(1).subscribe(

    r => {// call the service which download the file
        this.licenseInfoService.generateLicensePDF(r).subscribe(

            r => console.log("yeah"),
            err => console.log(err))

   }

}

我尝试了很多事情,但错误始终是:

返回HttpErrorMessage,此错误消息的状态为400

  

“”:[[    输入无效。

或:

它返回HttpErrorMessage,此错误消息的状态为200

  

SyntaxError:JSON中意外的令牌%在XMLHttpRequest.onLoad的JSON.parse()位置0处

1 个答案:

答案 0 :(得分:1)

如何设置responseType

generateLicensePDF(license){
    return this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license, { responseType: 'blob' });
}

然后您可以安装Angular FileSaver

npm install file-saver --save

然后:

import { saveAs } from 'file-saver';

onSubmit(){
    // get a license by id and it's return license's data
    this.licenseInfoService.getLicenseById(1).subscribe(

    r => {// call the service which download the file
        this.licenseInfoService.generateLicensePDF(r).subscribe(
            x => {
                saveAs(x);
                console.log("yeah")
            },
            err => console.log(err))
   }
}

这将使您获得服务的 Blob 结果,并使用saveAs将其下载到计算机上。如果您想获得文件响应,可以使用:

this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license, { observe: 'response', responseType: 'blob' });

然后可以使用以下命令保存文件:

saveAs(r.body)

我希望这对您有帮助...