美文网首页
input实现拖拽文件上传

input实现拖拽文件上传

作者: 菜蚴菜 | 来源:发表于2024-08-20 18:59 被阅读0次
  <input
       id="fileInput"
       type="file"
       @change="onSelectFileInputChange"
       @drag.stop
        @dragover.stop
        style="display: none;"
        :multiple="false" //设为true时可以同时上传多个文件
         accept="image/png" //限制上传的文件类型
         title=""
 / >
 mounted() {
    // 防止拖拽时容器奔溃,要阻止拖拽事件的默认行为
    const dragArr = ['dragenter', 'dragover', 'drop']
    dragArr.forEach((name) => {
      document.addEventListener(name, (event) => {
        event.preventDefault()
      })
      this.$once('hook:beforeDestroy', () => {
        document.removeEventListener(name, (event) => {
          event.preventDefault()
        })
      })
    })
  },
    // 拖拽更新文档
    onSelectFileInputChange(e) {
      const files = e?.target?.files
      if (!files.length) {
        return
      }
      const file = files[0]
      const path = e?.target
      this.getFileInfo(file)
    },

    // 分块读取文件,不然文件太大会读取失败
    readFileInChunks(file, callback) {
      const chunkSize = 2097152; // 2MB
      const fileSize = file.size;
      let offset = 0;
      const reader = new FileReader();
      reader.onload = function (e) {
        // 继续读取剩余部分
        offset += chunkSize;
        if (offset < fileSize) {
          reader.readAsDataURL(file.slice(offset, offset + chunkSize));
        } else {
          callback({ data: reader, error: false })
        }
      };

      reader.onerror = function () {
        callback({ data: null, error: true })
      };

      // 开始读取第一块
      reader.readAsDataURL(file.slice(offset, offset + chunkSize));
    },
  //获取文件信息
   getFileInfo(file) {
      return new Promise(async (resolve) => {
        if (!file || !file.size || !file.name) {
          resolve(null)
          return
        }
        this.readFileInChunks(file, (result) => {
          if (result.error) {
            return
          }
          //获取到文件的base64
          const content = result.data.result
        })
      })
    },

// 更改拖拽时的图标
#fileInput::file-selector-button {
  background-image: url('path_to_your_icon.png');
  background-size: contain;
  background-repeat: no-repeat;
  height: 30px; /* 设置按钮的高度 */
  width: 100px; /* 设置按钮的宽度 */
  border: 1px solid #999; /* 设置按钮的边框 */
  color: #333; /* 设置按钮的文本颜色 */
  padding: 5px 10px; /* 设置按钮内的填充 */
}
 
#fileInput {
  /* 隐藏默认的文件选择控件 */
  position: absolute;
  clip: rect(0, 0, 0, 0);
}

相关文章

  • JavaScript 实现一个文件拖拽 demo

    现在在很多网页上上传文件时,都会有一个拖拽上传的功能,而不需要我们点击 input 控件再选择文件。那么这个拖拽的...

  • vue实现文件上传

    本文主要介绍input标签实现的文件上传 input 标签上传也有两种写法 一、隐藏input标签 将input标...

  • 图片上传案例

    demo js 实现 input type="file" 文件上传示例代码

  • upload

    多文件上传并预览 利用input 的type='file" 可以实现文件的上传,不过只支持单个文件上传。只有给in...

  • vue原生文件上传,可以多文件上传

    1.单文件上传 2.多文件上传 在input上加属性multiple="multiple"即可实现多文件上传,也可...

  • input实现文件上传

    通过input自身的type=file实现,需要注意的是input对于一个文件只能选择一次,所以如果要多次选中需要...

  • 禁止用户拖拽图片或文件到窗口

    在做文件上传功能的时候,如果没有做响应用户拖拽文件的功能的话,建议先禁用拖拽功能。 实现代码: jquery版本(...

  • input[file]标签点击选择文件响应很慢的解决办法

    input[file]标签的accept属性可用于指定上传文件的MIME类型。例如,想要实现默认上传图片文件的代码...

  • django实现拖拽文件上传

    1、首先简单的介绍一下前端工作的流程(大概原理,如果阅读本文的是后台开发则不需要深入掌握)将windows上的文件...

  • hadoop开发应用

    hadoop开发应用 一、文件上传 创建input文件夹# hadoop fs -mkdir /input 上传...

网友评论

      本文标题:input实现拖拽文件上传

      本文链接:https://www.haomeiwen.com/subject/cbmtqjtx.html