首页 > 其他分享 >vue中实现上传 ,下载功能

vue中实现上传 ,下载功能

时间:2023-10-26 15:37:33浏览次数:30  
标签:vue 上传 link blob document data 下载

上传功能(包括上传图片,上传文件)
使用 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
}

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/26/vue%e4%b8%ad%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0-%ef%bc%8c%e4%b8%8b%e8%bd%bd%e5%8a%9f%e8%83%bd/

欢迎入群一起讨论

 

 

标签:vue,上传,link,blob,document,data,下载
From: https://www.cnblogs.com/songsu/p/17789501.html

相关文章

  • Vue3 子组件修改父组件传过来的值
    Vue3子组件修改父组件传过来的值1、在父组件中,找到引用的子组件,在引用中加入v-model例如:子组件是demo,需要穿的值为num这个有个温馨提示,(v-model+冒号+需要穿的值)这个v-model可以写多个<demov-model:num="num"></demo>//例如可以写多个需要修改多个传入的值<demov-mo......
  • Vue localStorage 将数据存为数组
    VuelocalStorage将数据存为数组要把表单数据存成数组形式,在另一个页面通过v-for渲染展示,因为拥有同一个key值,在每次更新表单数据时都会发生数据覆盖现象。vartemplist=JSON.parse(localStorage.getItem("msgBody")||"[]");templist.push(this.msgBody);......
  • NLTK debug记录——"[nltk_data] Error loading xxx"下载数据集失败
    问题:运行nltk.download("xxx")时遇到连接下载失败Error解决:在gitee上下载对应的.zip词库包(如,nltk_data/pakages/copora/目录下的下载链接);NLTK下载数据集时会自动搜索某些以./nltk_data/为结尾的目录(见附注),找到一个这样的目录并确保自己有写这个目录的权限,如果上一层目录下没有n......
  • vue学习笔记之执行顺序
       vue文件加载顺序:index.html>app.vue>main.js     加载顺序详情:执行index.html(index.html中id为app的div标签是一个挂载点,之后我们的Vue根实例就会挂载到该挂载点上)执行main.jsmain.js找到实例挂载app.vue文件,将index.html的挂载的内容显示出来(用app.vue的template......
  • vue + tornado 个人博客项目简介
    vue+tornado个人博客项目简介项目链接:https://www.freepd.top项目链接:https://admin.freepd.top项目简介首页预览本站接入了百度api每小时更新访问量域名在阿里云购买,解析到腾讯云服务器ssl证书为阿里云每年免费申请20个技术栈前端:vue2+element-ui+axios+vue......
  • Vue2 element-table 动态添加一行
    Vue2element-table动态添加一行<template><divclass="app-container"><!--表格--><el-table:data="tableData":height="fullHeight"border><el-table-columntype="index"label=&q......
  • MarkDown笔记如何上传cnblog
    简介Dotnet-cnblog工具可以配合typora实现自动上传md文件里图片到博客园的图床,这样就不用自己一张张来上传安装过程1.配置NET环境net环境下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/5.0下载后安装NET环境,运行cmd命令:dotnet--info查看是否安装成功2.安......
  • 在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问
    一般表现是打包最后一步会等待超长时间,最后报错,错误信息:PickedupJAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8FAILURE:Buildfailedwithanexception.*Whatwentwrong:Aproblemoccurredconfiguringrootproject'Gradle'.>Couldnotresolveallartifactsfor......
  • FFmpeg 下载安装教程及介绍
    一、下载安装(1)进入官网 https://www.ffmpeg.org/ (2)根据自己的电脑选择对应系统进行点击。我选定是windows,选择下面出现的“Windowsbuildsfromgyan.dev”,  (3)在稳定版本中选择一个进行下载, 4)等待下载完成, (5)下载完成压缩文件之后,解压文件。(6)将bin文件夹添加到Wi......
  • Captura 下载安装及在Captura配置FFmpeg(录屏软件)
    一、下载安装(1)下载地址 https://github.com/MathewSachin/Captura/releases(2) 点击下载Captura-Setup.exe,等待下载完成, (3)双击进行安装,会弹出安装流程页面, 这里我发现Captura安装时没有中文语言选项,就默认English吧, 直接点击“OK”,  可以根据自己需求改变安装路径,......