解决vue下载后台传过来的乱码流的问题可以分为以下几个步骤:
- 确认后台接口返回的数据是正确编码的,比如UTF-8。
- 在vue中通过axios等网络请求库获取数据时,设置responseType为'blob',这样能保证我们得到的数据是二进制的。
- 通过FileReader读取二进制数据,并转换为String。
- 创建Blob对象,将转换后的String数据存入该对象中。
- 创建a标签,设置href属性为Blob对象的URL,设置download属性为文件名,模拟点击该标签,浏览器会下载该文件。
示例1:
// 请求数据,设置responseType为'blob'
axios.get('http://example.com/data', { responseType: 'blob' })
.then(response => {
// 将二进制流转换为字符串
const reader = new FileReader()
reader.readAsText(response.data, 'utf-8')
reader.onload = () => {
const data = reader.result
// 将字符串存入Blob对象中
const blob = new Blob([data], { type: 'application/pdf' })
// 创建a标签,设置href属性为Blob对象的URL,设置download属性为文件名
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = 'file.pdf'
// 模拟点击该标签,浏览器会下载该文件
link.click()
}
})
示例2:
// 定义一个工具函数,保证response.data为字符串类型
function convertBlobToString(response) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsText(response.data, 'utf-8')
reader.onload = () => {
const data = reader.result
resolve(data)
}
reader.onerror = () => {
reject(new Error('Failed to convert blob to string'))
}
})
}
// 请求数据,设置responseType为'blob'
axios.get('http://example.com/data', { responseType: 'blob' })
.then(response => {
// 将二进制流转换为字符串
return convertBlobToString(response)
})
.then(data => {
// 将字符串存入Blob对象中
const blob = new Blob([data], { type: 'application/pdf' })
// 创建a标签,设置href属性为Blob对象的URL,设置download属性为文件名
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = 'file.pdf'
// 模拟点击该标签,浏览器会下载该文件
link.click()
})
.catch(error => {
console.error(error)
})
以上是解决vue下载后台传过来的乱码流的问题的完整攻略,其中包含了两条示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决vue下载后台传过来的乱码流的问题 - Python技术站