使用axios强制下载GET请求
Force download GET request using axios
我正在使用 vuejs 2 + axios。
我需要发送一个获取请求,将一些参数传递给服务器,并获取一个 PDF 作为响应。服务器使用 Laravel.
所以
axios.get(`order-results/${id}/export-pdf`, { params: { ... }})
请求成功但它没有开始强制下载,即使服务器 returns 正确 headers.
我认为这是一个典型的情况,当您需要形成一个 PDF 报告并将一些过滤器传递给服务器时。那么如何实现呢?
更新
所以实际上我找到了解决方案。然而,同样的方法不适用于 axios,不知道为什么,这就是我使用原始 XHR object 的原因。所以解决方案是创建一个 blob object 和 user createUrlObject
函数。示例:
let xhr = new XMLHttpRequest()
xhr.open('POST', Vue.config.baseUrl + `order-results/${id}/export-pdf`, true)
xhr.setRequestHeader("Authorization", 'Bearer ' + this.token())
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.responseType = 'arraybuffer'
xhr.onload = function(e) {
if (this.status === 200) {
let blob = new Blob([this.response], { type:"application/pdf" })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Results.pdf'
link.click()
}
}
重要提示:您应该将数组缓冲区作为响应类型
然而,同样的代码写在 axios returns PDF 里面是空的:
axios.post(`order-results/${id}/export-pdf`, {
data,
responseType: 'arraybuffer'
}).then((response) => {
console.log(response)
let blob = new Blob([response.data], { type: 'application/pdf' } ),
url = window.URL.createObjectURL(blob)
window.open(url); // Mostly the same, I was just experimenting with different approaches, tried link.click, iframe and other solutions
})
我认为在 axios 甚至 AJAX 中都不可能做到这一点。该文件将保存在内存中,即您无法将文件保存到磁盘。这是因为 JavaScript 无法与磁盘交互。这将是一个严重的安全问题,并且在所有主要浏览器中都被阻止。
您可以在前端构建您的URL并通过以下方式下载:
var url = 'http://example.com/order-results/' + id + '/export-pdf?' + '..params..'
window.open(url, '_blank');
希望对您有所帮助!
您得到的是空 PDF,因为没有数据传递到服务器。您可以尝试使用这样的数据对象传递数据
axios
.post(`order-results/${id}/export-pdf`, {
data: {
firstName: 'Fred'
},
responseType: 'arraybuffer'
})
.then(response => {
console.log(response)
let blob = new Blob([response.data], { type: 'application/pdf' }),
url = window.URL.createObjectURL(blob)
window.open(url) // Mostly the same, I was just experimenting with different approaches, tried link.click, iframe and other solutions
})
顺便说一句,非常感谢您向我展示了提示,以便从响应中下载 pdf。谢谢你:)
var dates = {
fromDate: 20/5/2017,
toDate: 25/5/2017
}
我用过的方式是,
axios({
method: 'post',
url: '/reports/interval-dates',
responseType: 'arraybuffer',
data: dates
}).then(function(response) {
let blob = new Blob([response.data], { type: 'application/pdf' })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Report.pdf'
link.click()
})
我遇到了类似的问题 - 我最终创建了 link 并从那里下载。
我在另一个 Whosebug 问题的 中提供了更多详细信息。
试试这个:
它非常适合我,兼容 Internet Explorer 11(createObjectURL 在 Explorer 11 上不起作用)
axios({
url: 'http://vvv.dev',
method: 'GET',
responseType: 'blob', // important
}).then((response) => {
if (!window.navigator.msSaveOrOpenBlob){
// BLOB NAVIGATOR
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'download.pdf');
document.body.appendChild(link);
link.click();
}else{
// BLOB FOR EXPLORER 11
const url = window.navigator.msSaveOrOpenBlob(new Blob([response.data]),"download.pdf");
}
});
https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743
我尝试了上面建议的一些方法,但在我的情况下,浏览器向我发送了弹出窗口阻止警告。
下面描述的代码对我有用:
axios.get(url, {responseType: 'arraybuffer'})
.then(function (response) {
var headers = response.headers();
var blob = new Blob([response.data],{type:headers['content-type']});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "Your_file_name";
link.click();
});
这段代码对我有用:
let xhr = new XMLHttpRequest()
xhr.open('POST', Vue.config.baseUrl + `order-results/${id}/export-pdf`, true)
xhr.setRequestHeader("Authorization", 'Bearer ' + this.token())
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.responseType = 'arraybuffer'
xhr.send()
xhr.onload = function(e) {
if (this.status === 200) {
let blob = new Blob([this.response], { type:"application/pdf" })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Results.pdf'
link.click()
}
}
我正在使用 vuejs 2 + axios。 我需要发送一个获取请求,将一些参数传递给服务器,并获取一个 PDF 作为响应。服务器使用 Laravel.
所以
axios.get(`order-results/${id}/export-pdf`, { params: { ... }})
请求成功但它没有开始强制下载,即使服务器 returns 正确 headers.
我认为这是一个典型的情况,当您需要形成一个 PDF 报告并将一些过滤器传递给服务器时。那么如何实现呢?
更新
所以实际上我找到了解决方案。然而,同样的方法不适用于 axios,不知道为什么,这就是我使用原始 XHR object 的原因。所以解决方案是创建一个 blob object 和 user createUrlObject
函数。示例:
let xhr = new XMLHttpRequest()
xhr.open('POST', Vue.config.baseUrl + `order-results/${id}/export-pdf`, true)
xhr.setRequestHeader("Authorization", 'Bearer ' + this.token())
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.responseType = 'arraybuffer'
xhr.onload = function(e) {
if (this.status === 200) {
let blob = new Blob([this.response], { type:"application/pdf" })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Results.pdf'
link.click()
}
}
重要提示:您应该将数组缓冲区作为响应类型
然而,同样的代码写在 axios returns PDF 里面是空的:
axios.post(`order-results/${id}/export-pdf`, {
data,
responseType: 'arraybuffer'
}).then((response) => {
console.log(response)
let blob = new Blob([response.data], { type: 'application/pdf' } ),
url = window.URL.createObjectURL(blob)
window.open(url); // Mostly the same, I was just experimenting with different approaches, tried link.click, iframe and other solutions
})
我认为在 axios 甚至 AJAX 中都不可能做到这一点。该文件将保存在内存中,即您无法将文件保存到磁盘。这是因为 JavaScript 无法与磁盘交互。这将是一个严重的安全问题,并且在所有主要浏览器中都被阻止。
您可以在前端构建您的URL并通过以下方式下载:
var url = 'http://example.com/order-results/' + id + '/export-pdf?' + '..params..'
window.open(url, '_blank');
希望对您有所帮助!
您得到的是空 PDF,因为没有数据传递到服务器。您可以尝试使用这样的数据对象传递数据
axios
.post(`order-results/${id}/export-pdf`, {
data: {
firstName: 'Fred'
},
responseType: 'arraybuffer'
})
.then(response => {
console.log(response)
let blob = new Blob([response.data], { type: 'application/pdf' }),
url = window.URL.createObjectURL(blob)
window.open(url) // Mostly the same, I was just experimenting with different approaches, tried link.click, iframe and other solutions
})
顺便说一句,非常感谢您向我展示了提示,以便从响应中下载 pdf。谢谢你:)
var dates = {
fromDate: 20/5/2017,
toDate: 25/5/2017
}
我用过的方式是,
axios({
method: 'post',
url: '/reports/interval-dates',
responseType: 'arraybuffer',
data: dates
}).then(function(response) {
let blob = new Blob([response.data], { type: 'application/pdf' })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Report.pdf'
link.click()
})
我遇到了类似的问题 - 我最终创建了 link 并从那里下载。
我在另一个 Whosebug 问题的
试试这个: 它非常适合我,兼容 Internet Explorer 11(createObjectURL 在 Explorer 11 上不起作用)
axios({
url: 'http://vvv.dev',
method: 'GET',
responseType: 'blob', // important
}).then((response) => {
if (!window.navigator.msSaveOrOpenBlob){
// BLOB NAVIGATOR
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'download.pdf');
document.body.appendChild(link);
link.click();
}else{
// BLOB FOR EXPLORER 11
const url = window.navigator.msSaveOrOpenBlob(new Blob([response.data]),"download.pdf");
}
});
https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743
我尝试了上面建议的一些方法,但在我的情况下,浏览器向我发送了弹出窗口阻止警告。 下面描述的代码对我有用:
axios.get(url, {responseType: 'arraybuffer'})
.then(function (response) {
var headers = response.headers();
var blob = new Blob([response.data],{type:headers['content-type']});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "Your_file_name";
link.click();
});
这段代码对我有用:
let xhr = new XMLHttpRequest()
xhr.open('POST', Vue.config.baseUrl + `order-results/${id}/export-pdf`, true)
xhr.setRequestHeader("Authorization", 'Bearer ' + this.token())
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.responseType = 'arraybuffer'
xhr.send()
xhr.onload = function(e) {
if (this.status === 200) {
let blob = new Blob([this.response], { type:"application/pdf" })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'Results.pdf'
link.click()
}
}