溶液:
上面的代码是正确的。缺少的是将适当的添加为 .responseType
arraybuffer
我被回应中的人吓坏了,这误导了我。这些问号是可以的,因为pdf是一个二进制数据,应该由适当的读者阅读。????
阵列缓冲器:
数组缓冲区精确地用于保存二进制数据。
这是 mozilla 网站上的定义:
ArrayBuffer 对象用于表示一个通用的、固定长度的原始二进制数据缓冲区。您不能直接操作数组缓冲区的内容;相反,您可以创建一个类型化数组对象或一个以特定格式表示缓冲区的 DataView 对象,并使用它来读取和写入缓冲区的内容。
该字符串指示响应的类型。通过告诉它一个数组缓冲区,然后它相应地处理数据。ResponseType
只需添加响应类型,我就设法正确下载了pdf文件。
代码:
这是经过纠正的 Vue 代码(与以前完全相同,但添加了 responseType):
downloadFile() {
this.$http.get(this.appApiPath + '/testpdf', {responseType: 'arraybuffer'})
.then(response => {
let blob = new Blob([response.data], { type: 'application/pdf' })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = 'test.pdf'
link.click()
})
}
编辑:
这是一个更完整的解决方案,考虑了其他浏览器的行为:
downloadContract(booking) {
this.$http.get(this.appApiPath + '/download_contract/' + booking.id, {responseType: 'arraybuffer'})
.then(response => {
this.downloadFile(response, 'customFilename')
}, response => {
console.warn('error from download_contract')
console.log(response)
// Manage errors
}
})
},
downloadFile(response, filename) {
// It is necessary to create a new blob object with mime-type explicitly set
// otherwise only Chrome works like it should
var newBlob = new Blob([response.body], {type: 'application/pdf'})
// IE doesn't allow using a blob object directly as link href
// instead it is necessary to use msSaveOrOpenBlob
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(newBlob)
return
}
// For other browsers:
// Create a link pointing to the ObjectURL containing the blob.
const data = window.URL.createObjectURL(newBlob)
var link = document.createElement('a')
link.href = data
link.download = filename + '.pdf'
link.click()
setTimeout(function () {
// For Firefox it is necessary to delay revoking the ObjectURL
window.URL.revokeObjectURL(data)
}, 100)
},