导出文件流,失败,提示错误信息

当下载文件失败时,应该显示后端返回的错误信息,而不是将错误信息流写入下载的文件。文章介绍了两种处理方式:1) 当`responseType`设为`arraybuffer`时,通过`FileReader`读取并检查是否包含错误信息;2) 当`responseType`设为`blob`时,根据`Blob.type`判断内容类型,如果是文件则处理下载,是JSON数据则解析并处理错误信息。这两种方式确保了错误信息的正确展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

背景:

下载文件失败时,要提示后端返回的错误信息,而不是将错误信息流写到下载的文件中。

知识点:

  • 下载文件请求,需要设置responseType为blob或arraybuffer
const xhr = new XMLHttpRequest()
 xhr.responseType = 'arraybuffer'
  // xhr.responseType = 'blob'

错误信息

  1. responseType为arraybuffer
this.$api.xxx().then((res) => {
     console.log(res); // arrayBuffer数据
     
     var reader = new FileReader();
     reader.onload = (data) => {
	     // 是错误信息返回
	     if (data.target && data.target.result) {
	        let result = data.target.result;
	        if (
	          typeof result === "string" &&
	          result.includes("code") &&
	          result.includes("msg")
	        ) {
	            result = JSON.parse(data.target.result);
	            this.$message.error(result.msg);
	            return;
	          }
	        }
	       // 是文件
	       // 此处省略下载文件代码。。。
	       
	     }
	 }
	 reader.readAsText(new Blob([res], { type: "application/json" })); // 按照json解析
}.catch((err) => {
    console.log('导出失败')
});

  1. responseType为blob
this.$api.xxx().then((res) => {
     console.log(res); // Blob对象 { size: 1234, type: "xxxxxx"}
     // Blob对象根据mdn描述,如果能解析,type是有值的,不然为空字符串
     // 这里返回是表格文件和JSON数据
     // 因此type会为:
     // 文件:application/octet-stream
     // JSON数据:application/json
     // 进行简单判断为blob对象:
     if(res && res.type) {
     	let type = res.type;
     	if(type === "application/octet-stream") {
			// Blob 对象处理
	       // 此处省略下载文件代码。。。
			return;
		}
		if(type === "application/json") {
			// json 数据处理
			let reader = new FileReader();
			reader.onload = (data) => {
	            // data是个对象 {..., target: { ..., result: 'asda', ....}}
	            // 会有一个target属性里包含了返回的JSON
	            if (data.target && data.target.result) {
	              let result = data.target.result;
	              // 进行自定义校验
	              if (
	                typeof result === "string" &&
	                result.includes("code") &&
	                result.includes("msg")
	              ) {
	                result = JSON.parse(data.target.result);
	                // 自定义处理
	                return;
	              }
	          	}
	        };
	        reader.error= (err)=> {
	        	// 读取失败,自定义处理
	        	console.log(err)
	        }
			// 数据解析为json,理解为读取文件数据
			reader.readAsText(new Blob([res], { type: "application/json" }));
			return;
		}
     }
     // 没有这里直接就算失败吧,根据实际情况自定义
     console.log('导出失败')
}.catch((err) => {
    console.log('导出失败')
});    

<think>好的,我现在需要帮助用户在Vue中使用GET方法导出文件流为TXT文件。首先,我得回忆一下之前用户提供的引用内容,里面提到了使用axios发送GET请求,设置responseType为blob,然后创建Blob对象和临时URL来实现下载。这些步骤对于导出Excel是有效的,但用户现在需要的是TXT文件,所以需要调整MIME类型和文件名后缀。 首先,用户的需求是导出TXT文件,所以Blob的type应该改为text/plain,而不是Excel的application/vnd.ms-excel。然后,下载的文件名后缀应该是.txt。此外,在创建a标签时,需要设置正确的download属性,比如文件名加上.txt。 接下来,我需要确保axios的配置正确,特别是responseType设为'blob',这样才能正确处理二进制流。另外,用户可能需要在请求中添加参数,比如查询条件或者时间戳防止缓存,这在示例中也有提到,比如使用_t参数。 然后,考虑Vue版本的差异。引用中的示例有Vue2和Vue3的代码,但用户没有明确说明使用哪个版本。不过无论哪个版本,核心步骤应该是一样的,主要是axios的配置和Blob处理部分。在Vue组件的方法中,需要将导出逻辑放在一个方法里,并在模板中绑定按钮的点击事件。 另外,需要注意错误处理,比如网络请求失败时的catch部分,以及可能的用户提示,比如导出成功或失败的消息。比如在用户的选择数据为空时,给出提示信息,这在第一个引用中有提到。 最后,要确保在创建临时URL后,正确释放资源,避免内存泄漏,即调用window.URL.revokeObjectURL。同时,动态生成文件名,比如加上时间戳,可以让每次导出文件名唯一,避免覆盖。 总结步骤应该是: 1. 在Vue组件中创建导出方法。 2. 使用axios发送GET请求,设置responseType为'blob'。 3. 处理响应,创建Blob对象,指定type为text/plain。 4. 生成临时URL,创建a标签触发下载。 5. 清理临时对象。 6. 添加错误处理和用户提示。 需要验证这些步骤是否正确,尤其是MIME类型是否正确,是否会导致浏览器正确识别为文本文件。另外,检查文件名是否带有.txt后缀,确保下载后文件类型正确。</think>在Vue.js中通过GET请求导出TXT文件流,可按照以下步骤实现: ### 一、核心实现步骤 1. **设置axios请求配置** ```javascript axios.get('你的接口地址', { params: { // 可选查询参数,如:ids: [1,2,3] _t: new Date().getTime() // 防止缓存 }, responseType: 'blob' // 必须声明响应类型为二进制流 }) ``` 2. **处理文件流响应** ```javascript .then(res => { // 创建Blob对象,指定MIME类型为text/plain const blob = new Blob([res.data], { type: 'text/plain;charset=utf-8' }) // 创建临时下载链接 const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = `data_${new Date().getTime()}.txt` // 自定义文件名 // 触发下载 document.body.appendChild(link) link.click() // 清理资源 document.body.removeChild(link) window.URL.revokeObjectURL(url) }) ``` 3. **完整Vue组件示例** ```vue <template> <button @click="exportTxt">导出TXT</button> </template> <script> import axios from 'axios' export default { methods: { async exportTxt() { try { const res = await axios.get('/api/export', { params: { /* 参数 */ }, responseType: 'blob' }) const blob = new Blob([res.data], { type: 'text/plain;charset=utf-8' }) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = `导出文件_${Date.now()}.txt` link.click() window.URL.revokeObjectURL(url) } catch (error) { console.error('导出失败:', error) this.$message.error('文件导出失败') } } } } </script> ``` ### 二、关键注意点 1. **MIME类型设置**:TXT文件使用$text/plain$类型,建议附加$charset=utf-8$确保中文正常显示[^1] 2. **文件名策略**:推荐添加时间戳`Date.now()`防止重复 3. **内存管理**:必须调用`revokeObjectURL()`释放创建的URL对象 4. **跨浏览器兼容**:Chrome/Firefox/Edge均支持此方案,Safari需验证文件名是否包含中文 ### 三、扩展优化方案 1. **大文件处理**:超过50MB的文件建议使用分片下载 2. **进度提示**:可添加加载动画 ```javascript axios.get(url, { onDownloadProgress: progressEvent => { const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total) console.log(`下载进度:${percent}%`) } }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值