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