基于vue-elementui的图片文件上传的高阶使用分享

排序师
• 阅读 6369

前言

要求:
1、图片上传支持多图片上传 +多浏览器图片格式判断;
2、多图片同时ajax上传 通过防并发设置防止可能出现的覆盖;
3、图片实时上传后支持 在新窗口中打开查看;

使用

main.js

import Vue from 'vue';
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI);

app.vue

注意:代码中是页面中存在for循环很多上传项,我为了省事直接复制粘贴的实现,如果单项上传 就不用考虑了

<template>
<el-container>
  <el-form-item v-for="(vv, vindex) in v" :key="vindex" :label="vv.c_name" :prop="vv.c_id">
    <el-upload
      class="upload-demo"
      name="multipartFile"
      :ref="'upload'+vv.c_id"
      :multiple="true"
      :accept="uploadAccept"
      :action="uploadUrl"
      :on-preview="uploadPreview"
      :on-success="(res,file,fileList)=>{return uploadSuccess(res,file, fileList, vv)}"
      :on-remove="(file,fileList)=>{return uploadRemove(file, fileList, vv)}"
      :before-upload="(file)=>{return beforeUpload(file, vv)}"
      :data="uploadData"
      :auto-upload="true"
      :limit="10"
      :on-exceed="uploadExceed"
      :disabled="!vv.isOpenUpload"
      :file-list="vm.picList">
      <el-button slot="trigger" size="small" type="primary" :loading="loading" :disabled="!vv.isOpenUpload">添加附件</el-button>
      <div slot="tip" class="el-upload__tip">只能上传jpg/png/pdf文件,且总数不超过10个</div>
    </el-upload>
  </el-form-item>
  <a :href="previewUrl" id="fileLink" target="_blank" style="display:none">下载</a>
</el-container>
</template>
<script>
export default {
  name: "App",
  data() {
    return {
      uploadAccept: "application/pdf,image/jpeg,image/png",//设置允许图片类型
      uploadUrl: "http://xxx.com/uploadApi",//配置ajax上传api
      uploadData: {
        par: 'xxxx',//额外多传递的参数
      },
      uploadTime: 0,//上传时间
      uploadTimeout: 0,//上传倒计时
      uploadNow: '',//当前上传项
      previewUrl: '',//预览项
    }
  },
  computed: {//实时计算
    loading(){
      return this.$store.state.loading;
    },
  },
  methods:{
    beforeUpload(file, vv){
      let vm = this;
      //解决火狐浏览器无法从标签选择上屏蔽上传项 
      if(file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'application/pdf'){
        vm.$message.error('只能上传jpg/png/pdf文件!');
        return false;
      }
      //有效解决一次选择多个图片并发出现上传后回执url存在相同覆盖
      let now = Date.now();
      if(vm.uploadNow != vv.c_id){
        vm.uploadNow = vv.c_id;
        vm.uploadTimeout = 0;
      }else{
        if(now-vm.uploadTime>1000){
          vm.uploadTimeout = 500;
        }else{
          vm.uploadTimeout += 1000;
        }
      }
      vm.uploadTime = now;
      return new Promise((resolve, reject) => {
        setTimeout(function(){
          vm.$store.dispatch('setLoading', true);
          resolve(true);
        },vm.uploadTimeout);
      });
    },
    //文件上传成功
    uploadSuccess(response, file, fileList, vv){
      let vm = this;
      let {code, result} = response;
      if(code == 200 && result){
        fileList.map(function(v){
          if(v.url == file.url){
            v.url = file.url = result;
          }
        });
        vv.reports = fileList;
      }
      //vuex loading false
      setTimeout(function(){
        vm.$store.dispatch('setLoading', false);
      },1000);
    },
    //文件超出
    uploadExceed(files, fileList) {
      this.$message.warning(`当前限制选择 10 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
    },
    //文件删除
    uploadRemove(file, fileList, vv){
      vv.reports = fileList;
    },
    //文件预览
    uploadPreview(file){
      let vm = this;
      vm.previewUrl = file.url;
      setTimeout(function(){
        document.getElementById('fileLink').click();
      },150);
    },
  },
}
</script>

校长红包福利

基于vue-elementui的图片文件上传的高阶使用分享

点赞
收藏
评论区
推荐文章
梦
5年前
uniapp上传图片显示进度
uniapp上传图片,官方文档写的比较清楚,此处笔记是因为客户特殊要求,上传提示进度条,查到方法特此笔记。uploadImg(){var_selfthis;uni.chooseImage({count:1,sizeType:'copressed',success:(res){console.log(r
Easter79 Easter79
4年前
springmvc 图片 压缩上传
第一步,下载相关js文件https://blogstatic.cnblogs.com/files/linxixinxiang/compression.js第二步,建立jsp页面1<%@pagelanguage"java"import"java.util."contentType"text/html;char
Stella981 Stella981
4年前
FastDFS图片服务器实现图片上传
一、传统使用1.将fastdfs\_client.jar导入工程2.加载配置文件(如conf.properties),配置文件中的内容就是tracker服务的地址。配置文件内容:tracker\_server192.168.25.133:221223.把commonsio、fileupload的jar包添加到工程中4.页面代码!
Wesley13 Wesley13
4年前
PHP实现图片(文件)上传
这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯首先,前端界面1、表单的首行需要加上enctype"multipart/formdata",需要上传的图片必须设置type"file"表示选择文件<formid"img_form"method"post"class"formhorizontal"r
Easter79 Easter79
4年前
Springboot框架实现图片上传显示并保存地址到数据库
1.在application.properties.xml中配置SpringBoot框架实现图片上传显示并保存地址到数据库springboot上传文件大小限制spring.http.multipart.maxfilesize200MBspring.http.multi
Stella981 Stella981
4年前
Fastdfs安装_nginx进行图片动态压缩
说明1.因为上传的图片较大,部分页面直接引用图片地址,则造成页面加载缓慢问题。2.考虑到服务器空间问题,我们没有进行上传缩略图。仅仅是上传了原图3.为了优化页面加载图片的时间问题,所以对图片进行动态缩放。PS:如果访问量较高,建议进行存储缩略图图片缩放采用nginx的http\_image\_filter\_module
Stella981 Stella981
4年前
HTML5 file API加canvas实现图片前端JS压缩并上传
一、图片上传前端压缩的现实意义对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。这种体验包括两方面:1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险。2.最最重要的体验改进点:省略了图片的再加工成本。很多网站的图片上传功能都会对图片的大小进
Stella981 Stella981
4年前
Javascript验证上传图片大小[前台处理]
需求分析:在做上传图片的时候,如果不限制上传图片大小,后果非常的严重。那么我们怎样才可以解决一个棘手的问题呢?有两种方式:1)后台处理:也就是AJAXPOST提交到后台,把图片上传到服务器上,然后获得该图片大小做处理。2)前台处理:也就是利用Javascript获取该图片大小。显然第一种方式,很不好。因为需要把文件先上传到
程序员小五 程序员小五
2年前
如何修改 SDK 默认的图片与视频压缩配置?
在使用Android/iOS客户端IMLib/IMKitSDK发送图片与小视频时,SDK有以下默认行为:图片:SDK会以原图30%质量生成符合标准大小要求的大图后再上传和发送。压缩后最长边不超过240px。缩略图用于在聊天界面中展示。图片:发送消息时如未选
Immerse Immerse
1年前
我悟了!原来本地图片预览还能这样搞
在网页开发中,经常会遇到需要让用户上传图片并在上传前进行预览的需求。这样做的好处显而易见:用户可以立即看到自己选择的图片是否正确,避免了不必要的上传和服务器资源浪费,提升了用户体验。
星河特战队员 星河特战队员
9个月前
鸿蒙开发实现图片上传(上传用户头像)
鸿蒙开发实现图片上传(上传用户头像)