Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下载文件不工作_Javascript_Angular - Fatal编程技术网

Javascript 下载文件不工作

Javascript 下载文件不工作,javascript,angular,Javascript,Angular,我是Javascript新手,我想下载一个来自动态url的文件,在承诺的结果之后,它是一个生成的pdf,我正试图通过以下调用下载它,但无法使其工作,因为下载没有启动 <button (click)='downloadMyFile()'>Download</button> downloadMyFile(){ //url .then((result)=>{ //result is contains a url www.abc.com/file234

我是Javascript新手,我想下载一个来自动态url的文件,在承诺的结果之后,它是一个生成的pdf,我正试图通过以下调用下载它,但无法使其工作,因为下载没有启动

<button (click)='downloadMyFile()'>Download</button>

downloadMyFile(){
  //url 
  .then((result)=>{
   //result is contains a url www.abc.com/file234
    window.location.href = result
})
  .catch((error)=>{
   //myerror
})
}
下载
下载我的文件(){
//网址
。然后((结果)=>{
//结果是包含一个url www.abc.com/file234
window.location.href=结果
})
.catch((错误)=>{
//迈罗
})
}
这里是下载 下载我的文件(){ 。然后((结果)=>{ var a=document.createElement('a'); a、 href=结果; a、 下载='下载名称'; a、 单击(); }).catch((错误)=>{}) }
使用以下代码行:

    //redirect current page to success page
    window.location="www.example.com/success.html";
    window.focus();
或者您也可以从中使用
pdf.js


源代码和完整代码:

只需执行以下操作,而无需发出ajax下载文件的请求

window.open(url);
(3个不同的文件)在
app.module.ts
中:

 import {HttpClientModule} from '@angular/common/http';
 ...
 providers: [
    HttpClientModule,
    ...
import {HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse} from '@angular/common/http';
...
public getMeMyPDF(): any {
    const url =  '/my/api/for/pdf';
    this.PDF = this.http.get(url, {
      observe: 'response',
      headers: new HttpHeaders({'Content-Type', 'application/pdf'}),
      responseType: 'text' as 'text' // <-- this part is rediculous but necessary
    }).catch(this.handleError);
    return this.PDF;
}

handleError(error: HttpErrorResponse) {
  console.log('an http get error happened.');
  console.error(error);
  let errorMessage;
  if (error.error instanceof Error) {
    errorMessage = `An error occurred: ${error.error.message}`;
  } else {
    errorMessage = `Server returned code: ${error.status}, error message is: ${error.message}`;
  }
  console.error(errorMessage);
  return errorMessage;
}
api.service.ts
中:

 import {HttpClientModule} from '@angular/common/http';
 ...
 providers: [
    HttpClientModule,
    ...
import {HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse} from '@angular/common/http';
...
public getMeMyPDF(): any {
    const url =  '/my/api/for/pdf';
    this.PDF = this.http.get(url, {
      observe: 'response',
      headers: new HttpHeaders({'Content-Type', 'application/pdf'}),
      responseType: 'text' as 'text' // <-- this part is rediculous but necessary
    }).catch(this.handleError);
    return this.PDF;
}

handleError(error: HttpErrorResponse) {
  console.log('an http get error happened.');
  console.error(error);
  let errorMessage;
  if (error.error instanceof Error) {
    errorMessage = `An error occurred: ${error.error.message}`;
  } else {
    errorMessage = `Server returned code: ${error.status}, error message is: ${error.message}`;
  }
  console.error(errorMessage);
  return errorMessage;
}

您可以按如下方式强制下载文件:

const link = document.createElement('a');
link.href = result;
link.download = 'download';
link.target = '_blank';
link.click();
只需创建锚定标记,设置其
href
下载
属性并触发
单击
事件

还要注意的是,这并不是关于URL是否以扩展名结尾的问题,而是关于随文件响应一起发送的标题(即
内容类型
内容处置

使用
saveAs()
函数和
npm install@types/file saver--save dev

或在package.json中:

  "dependencies": {
    "file-saver": "^1.3.3"
  }
导出CSV文件的示例:

HTML:

服务(食物服务):

从“文件保护程序”导入{saveAs};
从'@angular/common/http'导入{HttpParams,HttpResponse};
exportCsv(fooid:string){
let params:HttpParams=新的HttpParams();
params=params.append('fooid',fooid);
this.apiService.getCSVFile('api/foo/export',params).subscribe(响应=>this.saveToFileSystem(响应)
,error=>this.errorProcessor(error));
}
专用存储文件系统(响应:HttpResponse){
const contentDispositionHeader=response.headers.get('Content-Disposition');
让文件名='export.csv';
if(contentDispositionHeader!==null){
常量部分:字符串[]=contentDispositionHeader.split(“;”);
文件名=部分[1]。拆分('=')[1];
}
const blob=response.body;
如果(blob!==null){
saveAs(blob,文件名);
}
}

您可以下载下面提到的承诺回复:

 var triggerDownload = function(url, fileName) {
      var a = document.createElement("a");
      a.setAttribute("href", url);
      a.setAttribute("download", fileName);
      opts.container.append(a);
      a.click();
      $(a).remove();
  };

  downloadMyFile() {
      promise
       .then((result) => {
          triggerDownload(result, 'xyz.pdf'); 
        })
       .catch((error) => {
          //myerror
      })
  }

下面是在IE和chrome/safari中下载API响应的代码。这里的响应变量是API响应

 let blob = new Blob([response], {type: 'application/pdf'});
    let fileUrl = window.URL.createObjectURL(blob);
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, fileUrl.split(':')[1] + '.pdf');
    } else {
        window.open(fileUrl);
    }

您可以下载任何动态文件,只需在获取文件url的标记中写入下载。试试这个,让我知道它是否适合你

以下是工作示例:


这实际上并不需要Javascript,因此我建议使用最懒、最简单的解决方案——只需使用基本html标记即可

使用带有下载关键字的锚定标记,而不是按钮:

<a href="www.abc.com/file234" download="SuggestedFileName">Download</a>

不支持HTML5的非常旧的浏览器将会失败——旧的浏览器不会下载目标,而只是在浏览器中显示目标。这是非常优雅的降级和完全可以接受的回退

您可以使用css设置锚的样式,使其看起来像您想要的任何东西,这也是语义上最正确的标记:锚用于链接(这是一个链接),而按钮用于与表单交互(如提交)或与UI的其他交互。最终用户无论如何都不会知道或关心您使用的标签

如果url将被更改,比如根据与UI的交互获取不同的参数,您可以始终使用javascript更新标记上的url,但这是另一个问题


结果的内容是什么?@meskobalazs在《邮差》中,我看到一个对话框,上面写着下载文件。这是一个可下载的文件。在浏览器中打开结果url时会发生什么?或者,您可以将按钮包装在
中,只需将href设置为一旦检索到的href,以较少的javascript-y方式打开它。在按钮周围使用标记不是无效的吗?url传递一些动态数据,这些数据使用该值来获取文件。您的代码没有意义。该技术称为什么?语法对我来说似乎很陌生。我会试试,如果我的ApiService需要很长时间才能回复,我怎么能用一些不以文件扩展名结尾的url来模拟数据呢?
import { saveAs } from 'file-saver';
import { HttpParams, HttpResponse} from '@angular/common/http';

exportCsv(fooid: string) {
    let params: HttpParams = new HttpParams();
    params = params.append('fooid', fooid);
    this.apiService.getCSVFile('api/foo/export', params).subscribe(response => this.saveToFileSystem(response)
    , error =>  this.errorProcessor(error));
}

private saveToFileSystem(response: HttpResponse<Blob>) {
    const contentDispositionHeader = response.headers.get('Content-Disposition');
    let filename = 'export.csv';
    if (contentDispositionHeader !== null) {
      const parts: string[] = contentDispositionHeader.split(';');
      filename = parts[1].split('=')[1];
    }
    const blob = response.body;
    if (blob !== null) {
        saveAs(blob, filename);
    }
  }
 var triggerDownload = function(url, fileName) {
      var a = document.createElement("a");
      a.setAttribute("href", url);
      a.setAttribute("download", fileName);
      opts.container.append(a);
      a.click();
      $(a).remove();
  };

  downloadMyFile() {
      promise
       .then((result) => {
          triggerDownload(result, 'xyz.pdf'); 
        })
       .catch((error) => {
          //myerror
      })
  }
 let blob = new Blob([response], {type: 'application/pdf'});
    let fileUrl = window.URL.createObjectURL(blob);
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, fileUrl.split(':')[1] + '.pdf');
    } else {
        window.open(fileUrl);
    }
<a href="http://unec.edu.az/application/uploads/2014/12/pdf-sample.pdf" download>
<a href="www.abc.com/file234" download="SuggestedFileName">Download</a>