问题:用户上传文件,文件首先是上传到缓存,确然提交之后传给后端,同时要即时回显文件信息,可以预览图片和下载文档
注意点:
- 首先是上传到缓存之后也是会立即显示到当前上传界面
- 其次是当前上传文件的界面的文件,文件的图标是动态加载的
- 然后图片文件可以预览,其他文件点击可以下载
- 提交之后再次打开要能够回显
技巧:点击链接预览图片的时候,可以用Url打开新的页面
思路:
首先是第一步将文件通过接口上传到缓存,这一步要用new FormData()将数据处理过再上传
然后拿到接口返回给我们的文件名字,url,我们通过文件的名字,利用map得到文件的类型,再将文件名,url,文件类型存储到变量中
接着因为要即时回显文件信息,因此要在el-image中通过对文件类型判断动态加载本地的图片,要用require配合文件中夹杂类型名字,然后图片下面显示文件的名字,同时给上url方便图片预览和文件下载。
提交的时候附上文件信息的数组就可
再次打开的时候,直接加载文件信息的数组,动态加载
做法:
- 首先采用的是el的上传文件组件,上面是el-image加载图标,下面是el-upload上传文件
- 现在要处理文件上传到缓存的操作, handlechange来处理如何传到缓存
<el-upload
class="avatar-uploader"
ref="upload"
:show-file-list="false" action="#"
:on-change="handleChange"
:auto-upload="false"
>
<i class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
接下来要详细说明如何上传文件拿到缓存
我们会把文件数据利用new FormData()传给后端接口,然后拿到回传的文件名字和urL,再通过文件的名字来进行类型判定,这里要用Map来进行判断类型,最后得到我们要提交时的3个参数,文件类型,文件名字,文件url。
// 上传文件
handleChange(file, fileList) {
const form = new FormData();
form.append("file", file.raw);
uploadIcon(form).then((res) => {
if (res) {
this.$message({
message: "上传成功",
type: "success",
});
let type = res.name.split(".")[1]
//这里需要对type进行限制加工
let format = 'jpg=image,jpeg=image,bmp=image,webp=image,png=image,gif=image,doc=word,docx=word,xls=excel,xlsx=excel,ppt=ppt,pptx=ppt,pdf=pdf'
const myMap = new Map(format.split(',').map(entry => {
const [key, value] = entry.split('=');
return [key, value];
}));
type = myMap.get(type)
if(type == undefined){
type = 'default'
}
this.signInForm.push({
"format": type,
"name": res.name,
"url": res.url
})
} else {
this.$message.error("上传失败");
}
});
},
然后需要动态为不同类型的文件加载图标,文件名
:src="require('@/assets/icon/'+item.format+'.jpg')"
//上面是加载图标,下面是预览照片
:preview-src-list="[item.url]"
需要解决下载问题,给图标下面添加点击函数
<div @click="handlePreview(item.name,item.url)">{{item.name}}</div>
需要给文件的名字和url来进行下载。
下载函数如下
handlePreview(name, url){
var link = document.createElement("a"); //定义一个a标签
link.download = name; //下载后的文件名称
link.href = url;
link.click(); //模拟在按钮上实现一次鼠标点击
window.URL.revokeObjectURL(link.href);
},