Javascript 从api调用获取文件路径字符串后自动下载PDF

Javascript 从api调用获取文件路径字符串后自动下载PDF,javascript,node.js,angular,typescript,Javascript,Node.js,Angular,Typescript,我有一段代码片段,它返回一个字符串,该字符串是pdf文件的路径。我想知道,在我打电话后,我能让它自动下载浏览器中的pdf文件,而不是只返回字符串吗?如果是,怎么做 getMergedPDF(filesToUpload: Array<string>) { return this.http.post<string>('http://localhost:8080/merge-pdf', filesToUpload) .subscribe(data =>

我有一段代码片段,它返回一个字符串,该字符串是pdf文件的路径。我想知道,在我打电话后,我能让它自动下载浏览器中的pdf文件,而不是只返回字符串吗?如果是,怎么做

getMergedPDF(filesToUpload: Array<string>) {
    return this.http.post<string>('http://localhost:8080/merge-pdf', filesToUpload)
    .subscribe(data  => this.mergedUrl = data);
  }
getMergedPDF(filesToUpload:Array){
返回此.http.post('http://localhost:8080/merge-pdf',文件下载(pdf)
.subscribe(data=>this.mergedUrl=data);
}
其中,上面返回的字符串是一个文件路径:
/Users/foo/Documents/PDFMerger/PDFMerger/server/test-pdfs/merged-pdf.pdf


编辑:当我尝试下面的解决方案时,文件无法加载

您可能会遇到以下情况:

.subscribe(data  => {
  var dl = document.createElement('a');
  dl.setAttribute('href', data);
  dl.setAttribute('download', 'pdfname.pdf');
  document.body.appendChild(dl);
  dl.click();
  document.body.removeChild(dl);
});
您可以尝试以下方法:

            getMergedPDF(filesToUpload: Array<string>) {
    return this.http.post<string>('http://localhost:8080/merge-pdf', filesToUpload)
    .subscribe(data  => {
             this.mergedUrl = data;
             this.getPDF(this.mergedUrl);});
getPDF(uri){
this.http.get(uri, { responseType: 'blob' }) .subscribe(x=>{

            var newBlob = new Blob([x], { type: "application/pdf" });

           //IE Fix
            if (window.navigator && window.navigator.msSaveOrOpenBlob) {
                window.navigator.msSaveOrOpenBlob(newBlob);
                return;
            }
            const data = window.URL.createObjectURL(newBlob);
            var link = document.createElement('a');
            link.href = data;
            link.download = "merge.pdf";
            link.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));

            setTimeout(function () {
                window.URL.revokeObjectURL(data);
                link.remove();
            }, 100);
        });
getMergedPDF(filesToUpload:Array){
返回此.http.post('http://localhost:8080/merge-pdf',文件下载(pdf)
.订阅(数据=>{
this.mergedUrl=数据;
this.getPDF(this.mergedUrl);});
getPDF(uri){
this.http.get(uri,{responseType:'blob'}).subscribe(x=>{
var newBlob=newBlob([x],{type:“application/pdf”});
//修理工
if(window.navigator&&window.navigator.msSaveOrOpenBlob){
window.navigator.msSaveOrOpenBlob(newBlob);
返回;
}
const data=window.URL.createObjectURL(newBlob);
var link=document.createElement('a');
link.href=数据;
link.download=“merge.pdf”;
dispatchEvent(新的MouseEvent('click',{bubbles:true,cancelable:true,view:window}));
setTimeout(函数(){
window.URL.revokeObjectURL(数据);
link.remove();
}, 100);
});

这里的“a”是什么?HTML锚定标记appendChild(a)应该改为appendChild(dl)?看起来您已经接近了,但它返回的文件路径为:localhost:4200/(filepath-i-specify-over)它找不到。已编辑。您需要有相对的文件路径才能运行。引用错误:x未定义您得到的是一个链接,而不是对象。我已修改了我的答案。现在它应该可以运行了。我得到以下错误:HttpErrorResponse{headers:HttpHeaders,status:404,statusText:“未找到”,url:,ok:false,…}您好。我是应您的请求来找她的。我不确定您的解决方案为什么不起作用,但如果我必须猜测这是因为您没有任何服务器为您的pdf文件提供服务?如果是,请将您的url从“localhost:4200/../”更改为file://users/.../如果我是你,我会尝试让ng为主机和我的pdf文件服务。把它放在insi的资产文件夹中删除角度项目。url应该看起来像“localhost:4200/assets/merge pdf.pdf”。这将是确保typescript代码正确获取文件的第一步。