vue3手动上传文件到服务器且下载文件(文件流)至本地

手动上传

1.在使用element ui进行上传时,需要先给定action地址,然后关闭自动上传

:action="http://xxx:8080/"//给地址
:auto-upload="false" //关闭自动上传

2.通过触发on-change属性,拿到上传文件的信息(前提:我们的接口需要将文件参数传到后台),同时创建foemdata,将上传文件的raw追加进formdata

3.此时上传文件会被添加到文件队列,触发点击事件,进行提交【重点:需要子在接口写请求头,否则传过去的中文文件名字会乱码】

手动下载

下载文件时会有两种情况:1.后端给具体地址,前端进行拼接,就可以下载 2.后端给的是文件流

这里主要是文件流的方法(思路):

a.添加响应头,以便转化文件流格式(文件流转化为对象)【不写的话,下载后的文件可能打不开】

responseType:'arraybuffer'

b.获取要下载的文件信息

c.设置formdata,将转化后的文件的data转成Blob型,再将formdata转化地址

d.添加a标签以及a标签的属性,将地址给a标签的href以及将获取文件名字将名字a标签的download

e.将a标签追加进页面的子节点并处触发点击事件再移除节点

downloadFile(filename.value).then((res) =>{
    console.log(res);
    downloadfilename.value = res.config.params.filename
    let fileupdata = new Blob([res.data],{type:'application/octet-stream;charset=UTF-8'});
    downloadfileurl.value = URL.createObjectURL(fileupdata)
    const link = document.createElement('a')
    link.setAttribute('href', downloadfileurl.value)// 设置属性值
    link.style.visibility = 'hidden'
    link.download = downloadfilename.value // 给下载的文件命名
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    console.log(fileupdata);
})

Vue3中,你可以使用Element UI库提供的`el-upload`组件结合File API来实现在浏览器中下载文件,并允许用户选择保存的位置(通常是文件夹)。以下是一个简单的步骤: 1. 首先,安装Element UI的上传组件: ```bash npm install element-ui@latest ``` 2. 引入相关的样式和组件: ```javascript import { ElUpload } from 'element-plus'; ``` 3. 创建一个上传组件,并配置它支持选择文件和指定保存路径: ```html <template> <div> <el-upload action="你的服务器接收文件的URL" // 这里填写实际的上传地址 :before-upload="beforeUpload" :on-success="handleSuccess" :auto-upload="false" // 关闭自动上传,手动控制 ref="upload" > <el-button>点击选择文件</el-button> <div slot="tip">只能上传图片文件</div> </el-upload> <!-- 选择文件夹按钮 --> <button @click="openFolderPicker">选择保存文件夹</button> <el-dialog v-model="dialogVisible"> ... 文件夹选择弹窗内容 </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, }; }, methods: { beforeUpload(file) { if (/(gif|jpg|jpeg|png|bmp|webp)$/i.test(file.type)) { const size = file.size / 1024; // KB if (size > 5 * 1024) { this.$message.error('图片大小不能超过5MB'); return false; } } else { this.$message.error('只支持图片上传'); return false; } return true; }, handleSuccess(response, file) { const savePath = this.saveToCustomFolder(response.data); // 根据需要处理返回的路径 if (savePath) { file.url = savePath; } }, openFolderPicker() { this.dialogVisible = true; // 这部分需要你自己实现文件夹选择功能,比如使用FileSaver.js配合input[type=file]元素,或者封装axios请求到后台获取目录列表 }, saveToCustomFolder(path) { // 这里假设你已经实现了将文件保存到自定义路径的功能,返回路径给文件组件 // 如果需要让用户选择保存位置,这里应该返回用户的选择,而不是固定的路径 return path || ''; }, }, }; </script> ``` 记得实现`openFolderPicker`方法,这通常涉及到浏览器的`file` API或者其他第三方库,如FileSaver.js。这部分的具体实现会因环境和需求的不同而有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值