axios 上传(上传既包括二进制文件,又包括json数据)、下载(下载流数据另存为数据,流数据转换为json)

本文介绍了使用axios进行文件上传,包括二进制文件和json数据的组合上传,以及文件下载,特别是如何将流数据转化为Excel并下载,同时讲解了如何处理包含json的流数据并转换为json。

下载axios配置

function downloadPolicy(data) {
    return request({
        url: '/api/invo/goods/downloadPolicy',
        method: 'post',
        data,
        responseType: 'blob'
    });
}

流数据转换为excel文件并下载到本地

             downloadPolicy(data).then(res => {
    
                        // new Blob([data])用来创建URL的file对象或者blob对象
                        const url = window.URL.createObjectURL(new Blob([res]));
                        // 生成一个a标签
                        const link = document.createElement("a");
                        link.style.display = "none";
                        link.href = url;
                        link.download = "待批量开具清单.xlsx";
                        document.body.appendChild(link);
                        link.click();
              
                }).catch(() => {
                    this.$loading.hide();
                });

包含json数据的流转换为json

                        var reader = new FileReader();
                        console.log('reader', reader);
                        reader.readAsText(res, 'utf-8');
                        reader.onload = () => {
                            const parseData = JSON.parse(reader.result);
                            console.log('parse', parseData);
                            if (parseData.status === -1) {
                                this.$message.error(parseData.statusText);
                            }
                        };

上传axios配置

function uploadBatchPolicy(data) {
    return request({
        url: '/api/invo/invoice/uploadBatchPolicy',
        method: 'post',
        data,
        headers: { "Content-Type": "multipart/form-data" }
    });
}

上传(添加文件二进制数据和json数据)

            const formData = new FormData();
            // 通过append向form对象添加数据
            formData.append("file", rawFile);
            formData.append("name", 'wfz');
            this.$loading.show();
            uploadBatchPolicy(formData).then(res => {
                this.$loading.hide();
                if (res.status === 0) {
                    this.$message.success('上传成功!');
                    this.uuid = res.data.uuid;
                    this.searchForm.policyNoFileLineNum = res.data.policyCount;
                } else {
                    this.$message.error(res.statusText);
                }
            }).catch(() => {
                this.$loading.hide();
            });

 

### 使用 Axios.post 方法实现二进制文件流的下载功能 在前端使用 Axios 的 `post` 方法下载二进制文件时,需要正确配置请求参数以确保文件能够被正常解析和保存。以下是实现这一功能的关键点和完整代码示例。 #### 配置 Axios 请求 为了处理二进制数据流,必须设置 `responseType` 为 `blob` 或 `arraybuffer`。这一步是关键,因为默认情况下 Axios 会将响应数据解析为 JSON 格式[^1]。 ```javascript const axiosInstance = axios.create({ baseURL: '/api', responseType: 'blob' // 设置为 blob 以处理二进制数据 }); ``` #### 发送 Post 请求并处理响应 通过 Axios 的 `post` 方法发送请求,并在成功回调中处理返回的二进制数据流。以下是一个完整的实现示例: ```javascript function downloadFile(postData) { axios.post('/download', postData, { headers: { 'Content-Type': 'application/json' }, responseType: 'blob' // 确保响应类型为 blob }).then(response => { const fileBlob = response.data; const fileName = getFileNameFromHeader(response.headers['content-disposition']); const link = document.createElement('a'); link.href = URL.createObjectURL(fileBlob); link.download = fileName || 'default.xlsx'; // 如果未获取到文件名,则使用默认值 link.click(); }).catch(error => { if (error.response && error.response.data) { try { const errorMessage = JSON.parse(error.response.data).message; // 尝试解析错误信息 console.error('下载失败:', errorMessage); } catch { console.error('下载失败:', error.message); } } else { console.error('下载失败:', error.message); } }); } function getFileNameFromHeader(header) { const match = header && header.match(/filename=["']?([^"']+)["']?/); return match ? decodeURIComponent(match[1]) : null; // 解码文件名 } ``` #### 处理后端返回的异常信息 当 `responseType` 设置为 `blob` 时,如果后端返回的是 JSON 错误信息而不是二进制文件流,可能会导致无法正确解析错误内容。为了解决这一问题,可以在 `catch` 块中检查 `error.response.data` 并尝试将其解析为 JSON 格式[^1]。 #### 完整示例代码 以下是一个更完整的实现,包含对后端返回的异常信息的处理: ```javascript function downloadFileWithValidation(postData) { axios.post('/download', postData, { headers: { 'Content-Type': 'application/json' }, responseType: 'blob' }).then(response => { if (!response.data.type || response.data.type.startsWith('application/json')) { try { const jsonError = JSON.parse(new TextDecoder().decode(new Uint8Array(response.data))); console.error('下载失败:', jsonError.message); return; } catch (e) { console.error('无法解析服务器响应:', e.message); return; } } const fileBlob = response.data; const fileName = getFileNameFromHeader(response.headers['content-disposition']); const link = document.createElement('a'); link.href = URL.createObjectURL(fileBlob); link.download = fileName || 'default.xlsx'; link.click(); }).catch(error => { if (error.response && error.response.data) { try { const errorMessage = JSON.parse(error.response.data).message; console.error('下载失败:', errorMessage); } catch { console.error('下载失败:', error.message); } } else { console.error('下载失败:', error.message); } }); } function getFileNameFromHeader(header) { const match = header && header.match(/filename=["']?([^"']+)["']?/); return match ? decodeURIComponent(match[1]) : null; } ``` ### 注意事项 - 如果后端返回的 MIME 类型不正确,可能导致文件无法正常打开或显示为空白[^4]。 - 在某些情况下,后端可能不会返回 `Content-Disposition` 响应头,此时需要提供一个默认文件名[^3]。 - 当 `responseType` 设置为 `blob` 时,确保前端与后端的编码一致,以避免字符集冲突[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值