vue2,使用element中的Upload 上传文件,自定义上传http-request上传,上传附件支持多选,多个文件只发送一次请求,代码里有注释

复制直接使用,组件根据multiple是否多选来返回附件内容,支持多选就返回数据附件,则返回一个附件对象。

//uploadFiles.vue

<template>
  <div>
    <el-upload
      class="avatar-uploader"
      action="#"
      :accept="accept"
      :show-file-list="false"
      :http-request="HttpRequest"
      :multiple="multiple"
      :on-change="onChangeFile"
      ref="uploadFileRef"
    >
      <slot />
    </el-upload>
  </div>
</template>

<script>
export default {
  /**
   * limitation // 文件上传限制大小 type number  50就是50Mb
   * accept // 上传文件类型限制 accept=".xls, .xlsx"
   * multiple// 是否支持多选
   */
  name: "uploadFiles",
  props: ['limitation','accept','multiple'],
  data() {
    return {
      flag:true, // 节流控制
      filesList:[]  // 上传的附件内容
    }
  },
  methods: {
    // 触发父组件的fileRet方法,并返回所选附件数据Array
    updateHeading(files) {
      this.$emit('fileRet',files);
      this.emptyData();
    },
    HttpRequest(data){
      const isLt50M = data.file.size / 1024 / 1024 < this.limitation; // 限制文件大小
      if (!isLt50M) {
        this.$message.error('上传头像图片大小不能超过 50MB!');
        return
      }
      // 调用后台接口逻辑
      this.throttle(()=>{
        let retFile;
        // 如何支持多文件上传,返回附件数组,则返回当个文件对象
        if (this.multiple){
          retFile = this.filesList.map(o=>o.raw)
        } else {
          retFile = data.file
        }
        // 附件上传参数用formData.append('file',retFile)  
        this.updateHeading(retFile)
      },600)
    },
    // 清空已上传的附件数据,初始化
    emptyData() {
      this.$refs.uploadFileRef && this.$refs.uploadFileRef.clearFiles();
      this.filesList = [];
    },
    //使用节流的方式去触发提交,避免多上传附件时,选几个附件就会触发几次提交
    throttle(fn,delay){
      if(this.flag){
        setTimeout(() =>{ fn();this.flag = true },delay)
      }
      this.flag = false;
    },
    onChangeFile(file,fileList){
      this.filesList = fileList
    },
  },
  mounted() {},
  computed: {},
  watch: {}
}
</script>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这个问题可以回答。首先,你需要在Spring Boot创建一个RESTful API,用于处理文件上传请求。然后,你需要使用Vue2来创建一个简单的前端界面,用于上传文件并显示上传进度。最后,你需要将这两个组件集成在一起,以便用户可以通过前端界面上传文件并将其保存到服务器上。以下是一个简单的示例代码: Spring Boot后端代码: ``` @RestController public class FileUploadController { @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); try { // 保存文件到服务器 Path path = Paths.get("uploads/" + fileName); Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); return "上传失败!"; } return "上传成功!"; } } ``` Vue2前端代码: ``` <template> <div> <input type="file" @change="uploadFile"> <div v-if="uploading"> 上传进度:{{ progress }}% </div> </div> </template> <script> export default { data() { return { uploading: false, progress: 0 }; }, methods: { uploadFile(event) { this.uploading = true; const file = event.target.files[0]; const formData = new FormData(); formData.append("file", file); axios.post("/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, onUploadProgress: progressEvent => { this.progress = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); } }).then(response => { console.log(response.data); this.uploading = false; this.progress = 0; }).catch(error => { console.log(error); this.uploading = false; this.progress = 0; }); } } }; </script> ``` 请注意,这只是一个简单的示例代码,你需要根据你的实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草样的年华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值