vue中实现上传 ,下载功能

上传功能(包括上传图片,上传文件)
使用 element 组件库 https://element.eleme.cn/#/zh-CN/component/upload

<el-upload
 	class="avatar-uploader"
   :disabled="isUpload"
   action=""
   :show-file-list="false"
   :before-upload="beforeUpload">
   <el-button size="small" type="primary" @click="selImg">点击上传</el-button>
 </el-upload>
 
 	//函数解析
	//before-upload
	//上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
    beforeUpload(file) {
    //上传文件的文件流是无法被序列化并传递的。所以我们就可以使用到formdata对象
    //简单理解就是 new FormData() 包裹之后 生成的是二进制文件流 
      const formData = new FormData()
      formData.append('file', file)
      Upload(this.reportId,formData).then(res => {
        if (!res.data.success) {
          this.$message.error(res.data.msg)
          return false
        }
        this.$message.success('上传成功')
        this.loadTableData()
      })
      return false
    },

下载文件功能
如果是文件流的形式,需要借用a标签

	const token = this.$store.state.tionToken
    let a = document.createElement('a') //创建一个a标签元素
     a.style.display = 'none' //设置元素不可见
     a.href = `${location.origin}/api1/1t/${val.id}/load?access_token=${token}` //设置下载地址
     document.body.appendChild(a) //加入
     a.click() //触发点击,下载
     document.body.removeChild(a)// 在dom中移除a标签

responseType为blob的请求

一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。 
File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件
通俗的说,Blob就是h5提供的一个用于操作流的api
axios({
  method: data.method,
  url: `${data.url}${data.params ? "?" + data.params : ""}`,
  responseType: "blob",
  //这个地方如果responseType设为blob的话,返回的文件流将会被转成blob对象,
  //不是文件流,但是无论怎么设置都没有转成blob对象,
  data: data.data
})
  .then(res => {
    /**
     * blob下载思路
     * 1) 使用ajax发起请求,指定接收类型为blob(responseType: "blob")
     * 2)读取请求返回的头部信息里的content-disposition,返回的文件名就在这里面(或者自定义文件名,可跳过此步骤)
     * 3)使用URL.createObjectURL将请求的blob数据转为可下载的url地址
     * 4)使用a标签下载
     * 
     */
	const link = document.createElement("a");    // 创建一个下载标签<a>
	let blob = new Blob([res.data], { type: "application/vnd.ms-excel" });
	link.style.display = "none";
	link.href = URL.createObjectURL(blob);    //将请求的blob数据转为可下载的url地址
	
	// link.download = res.headers['content-disposition'] //下载后文件名
	link.download = data.fileName; //下载的文件名
	document.body.appendChild(link);
	link.click();    // 模拟点击下载
	document.body.removeChild(link); // 移除改下载标签
  })
  .catch(error => {
	this.$Notice.error({
	  title: "错误",
	  desc: "网络连接错误"
	});
	// console.log(error);
  });

图片预览功能

	<img src="" alt="" />
	//<img class="img" src="" alt="" />

	   let reader
	   if (formData.get("file")) {
	     // 创建流对象
	     reader = new FileReader()
	     reader.readAsDataURL(formData.get("file"))
	     console.log('reader' ,reader)
	   }
	   // 捕获 转换完毕
	   reader.onload = function(e) {
	     // 转换后的base64就在e.target.result里面,直接放到img标签的src属性即可
	     document.querySelector('img').src = e.target.result
	     //document.getElementsByClassName('img')[0].src = e.target.result
   }
文件上传: 1. 在 template 添加一个 input 标签,设置 type 为 file,用于选择要上传的文件。 ``` <template> <div> <input type="file" @change="handleUpload"> </div> </template> ``` 2. 在 methods 添加 handleUpload 方法,获取选的文件,使用 FormData 将其传递给后端。 ``` methods: { handleUpload(event) { const file = event.target.files[0] const formData = new FormData() formData.append('file', file) axios.post('/upload', formData) .then(response => { console.log(response) }) .catch(error => { console.log(error) }) } } ``` 3. 后端接收到文件后进行处理,返回上传成功的信息。 文件下载: 1. 在 template 添加一个 button 标签,用于触发下载操作。 ``` <template> <div> <button @click="handleDownload">下载文件</button> </div> </template> ``` 2. 在 methods 添加 handleDownload 方法,使用 axios 发送 GET 请求,将文件流返回给前端,使用 blob 对象将其下载到本地。 ``` methods: { handleDownload() { axios({ method: 'get', url: '/download', responseType: 'blob' }) .then(response => { const blob = new Blob([response.data]) const fileName = response.headers['content-disposition'].split('filename=')[1] const link = document.createElement('a') link.href = window.URL.createObjectURL(blob) link.download = fileName link.click() }) .catch(error => { console.log(error) }) } } ``` 3. 后端接收到下载请求后返回文件流,使用 Content-Disposition 响应头指定文件名。 ``` app.get('/download', (req, res) => { const filePath = path.join(__dirname, 'file.txt') const fileName = 'file.txt' res.setHeader('Content-Disposition', 'attachment; filename=' + fileName) const fileStream = fs.createReadStream(filePath) fileStream.pipe(res) }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值