element中手动图片上传,附带完整代码

先展示一张图片效果图片

这种上传时 很常见的。之所以写这篇文章的目的时记录一下,和之前完全不同的上传方式。

之前的上传方式:

由于<el-upload></el-upload>这个组件有自动上传,也就是说只要图片提交后就会自动上传。

所以之前都是  为这样的 表单提交提供两个接口,第一个接口提供图片接收,并返回接收后的图片路径。然后在和表单一起提交的第二个接口中。

缺点:需要提供两个接口。

优点:后台只需要写一中文件解析的接口就可以。毕竟 第一个接口是  接收文件  返回地址。所以用第一个接口处理不同文件

 

好像,现在来说一下,如何将数据和图片一起提交给一个接口

向上一张图片解释一下关键点

一个点一个点的解释一下

第一个点,这是一个钩子函数,这个第四个点有关系,目的是做到控制什么时候去上传到服务器

第二个点,每个上传的文件字段值,这个和你提交的数据文件字段有关系

第三个点,这里是设置请求头和请求体除文件以外的数据。

第四个点,这里是设置自动上传还是手动上传,默认是自动上传

第五个点,这里是一个监测文件变化的函数  目的是  什么时候区展示上传图片

第六个点,这里就是你上传的接口

知道这些以后就可以写一个  手动上传,一个接口的  上传了

 

由于是手动上传 所有需要在change时做上传检查,还有由于我本次上传只上传一张图片,所以在上传的fileList的长度达到2张图片后就需要使用splice(-1,1)删除,splice会删除原数组。

下面是完整的代码

<template>
    <div class="newTask">
      <el-container>
        <el-header class="indexTop">
          <div class="workNameArea" @click="returnRouter">
            <i class="el-icon-arrow-left"></i>
            <span>新建任务</span>
          </div>
        </el-header>
        <el-main>
          <div class="box">
            <div class="boxMin" v-loading="updateLoading" element-loading-text="拼命上传中" element-loading-spinner="el-icon-loading">
              <div class="updateImg">
                <div class="updateBox">
                  <el-upload class="upload-demo"
                             drag
                             ref="upload"
                             :show-file-list="false"
                             name="uploadFile"
                             :headers="myHeader"
                             :data="updateOtherData"
                             :auto-upload="false"
                             :on-success="handleAvatarSuccess"
                           
                             :on-progress="uploadVideoProcess"
                             :on-change="changeUpload"
                             action="/api/customer/resource/createTemplate"
                             multiple>
                    <i   v-if="imageUrl===''" class="el-icon-upload"></i>
                    <div v-if="imageUrl===''" class="el-upload__text"><em>点击上传</em></div>
                    <el-image v-if="imageUrl!==''" :src="imageUrl" class="actives" ></el-image>
                  </el-upload>
                </div>
              </div>

              <el-form label-position="top" :model="formLabelAlign" :rules="rules" ref="formLabelAlign" label-width="80px" >
                <el-form-item label="主题" prop="theme">
                  <el-input v-model="formLabelAlign.name" placeholder="输入内容" ></el-input>
                </el-form-item>
                <el-form-item label="地址" prop="address">
                  <el-input v-model="formLabelAlign.location" placeholder="输入内容"></el-input>
                </el-form-item>
                <el-form-item label="详细描述" prop="describe" >
                  <el-input v-model="formLabelAlign.description" placeholder="输入内容"></el-input>
                </el-form-item>
              </el-form>
              <el-button type="primary" class="newButtons" @click="newToDragTask('formLabelAlign')">下一步</el-button>
            </div>
          </div>

        </el-main>
      </el-container>

    </div>
</template>

<script>
  import Cookies from 'js-cookie';

  export default {
    name: 'newTask',
    data(){
      return {
        updateLoading:false,//显示上传加载
        myHeader:{},//请求头
        updateOtherData:{},//其他请求数据
        imageUrl:'',//图片路径
        formLabelAlign: {
          name: '',
          location: '',
          description: ''
        },
        rules: {
          name: [
            { required: true, message: '请输入主题', trigger: 'blur' },
          ],
          location: [
            { required: true, message: '请输入地址', trigger: 'blur' }
          ],
          description: [
            { required: true, message: '请输入详细描述', trigger: 'blur' }
          ]
        }
      }
    },
    methods:{
      returnRouter(){
        this.$router.push({path: '/index'})
      },
      newToDragTask(formLabelAlign){
        this.$refs[formLabelAlign].validate((valid) => {
          if (valid) {
            //上传之前
            this.myHeader.customerToken =Cookies.get('buildToken');//设置请求头部信息
            //设置其他请求参数
            this.updateOtherData.name=this.formLabelAlign.name;
            this.updateOtherData.location=this.formLabelAlign.location;
            this.updateOtherData.description=this.formLabelAlign.description;
            //触发上传
            this.$refs.upload.submit();

          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      handleAvatarSuccess(res, file) {//图片上传成功
        if(res.code==1){
          this.updateLoading = false;//关闭上传加载
          let name = this.formLabelAlign.name;
          let ids = res.data.id;
          this.$router.push({name: 'taskCenter', params: {id: ids, name: name}})
        }else{
          this.$message({
            type: 'error',
            message: '上传失败'
          })
        }
      },
      uploadVideoProcess(event, file, fileList){
        //弹出上传加载
        this.updateLoading = true;
      },

      //文件改变时
       changeUpload(file,fileList){
        //每次改变时,做检测
        let regs=/.+?(\.jpg|\.png|\.jpeg)/g;
        let isImg =  regs.test(file.name);
        let isLt3k = file.size / 1024 < 300;
        if (!isImg) {
          this.$message.error('请上传正确的图片格式');
        }
        if(!isLt3k){
          this.$message.error("请上传图片不能超过 300KB!")
        }
        if(fileList.length>1){//始终保证只有一张
          fileList.splice(-1,1);
        }
        if(isImg && isLt3k){
          //预览图片
          this.imageUrl = URL.createObjectURL(file.raw);
        }

      }
      
    }
  }
</script>

<style scoped>
  .box{
    width: 50%;
    margin: 60px auto 0;
    border: 1px solid #ddd;
    -moz-box-shadow: 10px 10px 5px #888888; /* 老的 Firefox */
    box-shadow: 10px 10px 5px #888888;
  }
  .boxMin{
    width: 75%;
    margin: 60px auto 0;
  }
  .upload-demo{

  }
  .newButtons{
    width: 50%;
    margin-left: 25%;
    margin-top: 66px;
    margin-bottom: 50px;
  }
  .updateImg{
    width: 100%;
    position: relative;
  }
  .updateBox{
    margin-top: 40px!important;
    width: 360px;
    margin: 0 auto;
  }
  .actives{
    width: 100%;
  }
</style>

上面即使完整的  ,注意看  那些方法,我是在做完了检测后才触发的  请求。

下面上传一个上传之前的 图片

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用Element UI和vue-quill-editor实现上传图片完整代码: 1. 安装需要的依赖: ``` npm install element-ui vue-quill-editor axios -S ``` 2. 在main.js引入依赖并注册组件: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import VueQuillEditor from 'vue-quill-editor' import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' import 'quill/dist/quill.bubble.css' import App from './App.vue' import axios from 'axios' Vue.prototype.$axios = axios Vue.use(ElementUI) Vue.use(VueQuillEditor) new Vue({ el: '#app', render: h => h(App) }) ``` 3. 在需要使用富文本编辑器的组件,添加以下代码: ```html <template> <div> <quill-editor v-model="content" :options="editorOption"></quill-editor> </div> </template> <script> export default { data() { return { content: '', editorOption: { modules: { toolbar: [ ['bold', 'italic', 'underline', 'strike'], // 加粗,斜体,下划线,删除线 [{ 'header': 1 }, { 'header': 2 }], // 标题,键值对的形式;1、2表示字体大小 [{ 'header': [1, 2, 3, 4, 5, 6, false] }], // 标题,键值对的形式;1、2表示字体大小 [{ 'color': [] }, { 'background': [] }], // 字体颜色,字体背景颜色 [{ 'font': [] }], // 字体 [{ 'align': [] }], // 对齐方式 ['blockquote', 'code-block'], // 引用,代码块 ['link', 'image', 'video'], // 链接,图片,视频 ['clean'] // 清除字体样式 ], // 上传图片 imageUploader: { upload(url, fd) { return new Promise((resolve, reject) => { this.$axios.post(url, fd).then(res => { resolve(res.data.data) }).catch(err => { reject(err) }) }) }, format(res) { return res.data.url } } } } } } } </script> ``` 注:这里的上传图片使用了axios,需要在使用前先引入并设置Vue.prototype.$axios = axios 这样就可以使用Element UI和vue-quill-editor实现上传图片功能了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值