el-upload 上传文件之后 实现文件流下载

本文介绍了如何在Vue项目中利用el-upload组件的on-preview属性实现文件下载功能。通过绑定on-preview事件,获取文件信息并调用下载接口,使用Blob对象创建文件流,然后利用a标签模拟点击下载。当遇到文件格式问题时,解决方案是在axios请求中设置responseType为'blob',确保文件类型正确。

想要下载文件列表的文件 需要在el-upload 上绑定 on-preview 属性

 <el-upload :action='upUrl' :data='upData' :headers="upheaders" :on-preview='dowloadFile' :show-file-list="true" :on-success="handleAvatarSuccess" :before-remove="beforeRemove" :file-list="fileList">
                <el-button size="small" type="primary">点击上传</el-button>
</el-upload>

通过on-preview 的参数获取当前点击文件的参数 ,并调用接口 返回文件流 通过Blob对象 实现文件流下载文件

dowloadFile(file) {

      downFile({
        filePath:file.url
        fileName:file.name
      }).then(res => {
        let blob = new Blob([res]);
        // 获取heads中的filename文件名
        let downloadElement = document.createElement('a');
        // 创建下载的链接
        let href = window.URL.createObjectURL(blob);
        downloadElement.href = href;
        // 下载后文件名
        downloadElement.download = fileName;
        document.body.appendChild(downloadElement);
        // 点击下载
        downloadElement.click();
        // 下载完成移除元素
        document.body.removeChild(downloadElement);
        // 释放掉blob对象
        window.URL.revokeObjectURL(href);
      })



    },

这样下载的文件会有问题,会造成文件的格式不对,是因为下载的时候没有指定下载的文件类型

想要下载所有类型的文件,直接在请求的时候(axios)加上 responseType: 'blob' 就可以了

export function downFile(data) {
  return request({
    url: '/xxxx/xxx ',
    method: 'post',
    data,
    responseType: 'blob'
  })
}

### 使用 `el-upload` 实现文件上传并转换为二进制流 为了实现使用 `el-upload` 组件将文件作为二进制流上传至服务器,可以按照如下方式构建前端逻辑。此过程涉及捕获用户选择的文件,并将其读取为二进制形式以便于后续操作。 #### HTML 结构定义 首先,在页面上配置好用于触发文件选择对话框以及展示已选文件列表的基础组件: ```html <template> <div> <!-- 配置 el-upload 控件 --> <el-upload ref="upload" :auto-upload="false" :on-change="handleChange" :before-upload="handleBeforeUpload"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> </el-upload> <p v-if="selectedFile">{{ selectedFileName }}</p> </div> </template> ``` 上述模板中包含了两个按钮:一个是用来打开文件浏览器的选择器;另一个则是提交所选文件给服务端使用的按钮[^4]。 #### JavaScript 方法编写 接下来是 Vue.js 的 script 部分,这里实现了几个重要的函数来处理文件选择事件、预览更改后的文件信息以及最终向服务器发送请求的过程: ```javascript <script setup> import { ref, reactive } from 'vue'; // 假设已经引入了 axios 库来进行 HTTP 请求 import axios from 'axios'; const upload = ref(null); let formData = new FormData(); const selectedFile = ref(null); // 存储当前选定的 File 对象 const selectedFileName = ref(''); function handleChange(file) { const fileObj = file.raw; if (fileObj) { selectedFile.value = fileObj; selectedFileName.value = file.name; let reader = new FileReader(); reader.onloadend = function(e) { console.log("Read as binary string", e.target.result); // 将读取的结果添加到 formdata 中准备传输 formData.append('binaryData', e.target.result); formData.append('fileName', file.name); // 清除之前可能存在的数据 while(formData.has('files')){formData.delete('files')} formData.append('files', fileObj); }; // 开始异步读取文件内容为二进制字符串 reader.readAsBinaryString(fileObj); } } async function submitUpload(){ try{ await axios.post('/api/upload', formData,{ headers:{ "Content-Type":'multipart/form-data' }, }); alert(`成功上传 ${selectedFileName.value}`); }catch(error){ console.error("Error during uploading:", error.response ? error.response.data : error.message); } } </script> ``` 这段脚本里有几个要点需要注意: - 当选择了新的文件时会调用 `handleChange()` 函数,它负责更新界面显示的同时也启动了一个 `FileReader` 来加载该文件的内容。 - 使用 `readAsBinaryString()` 可以获取文件原始字节序列表示的数据[^2]。 - 创建一个 `FormData` 对象并将必要的参数附加进去,这使得可以通过 POST 请求轻松地把表单字段连同文件一起传递给后端API[^3]。 #### CSS 样式调整(可选) 如果希望进一步美化这个上传区域,则可以根据实际需求自定义样式规则。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值