首页 > 其他分享 >前端如何实现大文件上传

前端如何实现大文件上传

时间:2023-10-10 18:14:26浏览次数:26  
标签:文件 return 前端 file const 上传 size

在开发过程中,经常会遇到一些较大文件上传,如果只使用一次请求去上传文件,一旦这次请求中出现什么问题,那么无论这次上传了多少文件,都会失去效果,用户则需要重新上传所有资源。所以就想到一种方式,将一个大文件分成多个小文件,这样通过多个请求实现大文件上传。

接下来我们就来看看具体是怎么实现的~


<input type="file" id="update-btn">

  <script>

    const updateInput = document.querySelector('#update-btn')

    updateInput.onchange = () => {

      const file = updateInput.files[0]

      if(!file){

        return

      }

    // 通过file的slice 方法可以将文件进行分割,第一个参数是从哪个字节开始,第二个参数是到哪个字节结束

      const chunk = file.slice(0,2000) 

  }

  </script>
  这时候我们在控制台可以得到 chunk 是

 这时,我们知道了如何将大文件进行切片,那么我们就创建个函数用于对文件进行切片


const updateInput = document.querySelector('#update-btn')

    updateInput.onchange = () => {

      const file = updateInput.files[0]

      if(!file){

        return

      }

      const chunkList = chunkFileFun(file, 1*1024*1024)

    }

    /**

    * @description: 文件分片函数

    * @param {

    *   file: 需要分片的文件,

    *   size: 文件按照每片多大去分片

    * }

    * @return: [] 文件分片后的数组

    */

    const chunkFileFun = ( file, size ) => {

      const result = []

      for (let i = 0; i < file.size; i += size) {

        result.push(file.slice( i, i + size))

      }

      return result

    }
 这时候我们可以看控制台,我们已经获取到了分片的数组

 

这样就结束了吗?并没有~ 如果我们再上传到一半的时候失败了,我们并希望下次上传文件重新上传,我们希望通过和服务器交互知道我们上次上传文件上传到哪里,我们从没有上传的切片继续上传就好了,那么这个东西我们应该如何实现呢?

我在这里使用的是spark-md5这个插件生成一个固定的hash值。大家也可以使用其他方式生成固定的hash值,我们上传的时候通过这个hash值,和服务端交互确认我们上传的是哪个文件上传到哪里,这样就可以解决我们的问题了


<script type="text/javascript" src="./spark-md5.min.js"></script>

  <input type="file" id="update-btn">

  <script>

    const updateInput = document.querySelector('#update-btn')

    updateInput.onchange = async () => {

      const file = updateInput.files[0]

      if (!file) {

        return

      }

      console.log('file', file)

      const chunkList = chunkFileFun(file, 1 * 1024 * 1024)

      console.log('chunkList', chunkList)

      const hash = await getHash(chunkList)

    }

    /**

    * @description: 获取文件hash

    * @param {file: 文件}

    * @return: hash

    */

    const getHash = (chunkList) => {

      const spark = new SparkMD5()

      return new Promise(resolve => {

        const chunkHash = (i) => {

          if (i >= chunkList.length) {

            resolve(spark.end())

            return

          }

          const blob = chunkList[i]

          const read = new FileReader()

          read.onload = e => {

            // 读取到的字节数量

            const byte = e.target.result

            spark.append(byte)

            chunkHash(i + 1)

          }

          read.readAsArrayBuffer(blob)

        }

        chunkHash(0)

      })

    }

    /**

    * @description: 文件分片函数

    * @param {

    *   file: 需要分片的文件,

    *   size: 文件按照每片多大去分片

    * }

    * @return: [] 文件分片后的数组

    */

    const chunkFileFun = (file, size) => {

      const result = []

      for (let i = 0; i < file.size; i += size) {

        result.push(file.slice(i, i + size))

      }

      return result

    }

  </script>
 在这个计算hash过程中需要读取整个文件的内容,这个过程时间会很长,我们一般不会在主线程做这个事,以免页面卡死,我们可以通过web worker,开辟另外一个线程去做这个事情。

参考文章:http://blog.ncmem.com/wordpress/2023/10/10/%e5%89%8d%e7%ab%af%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/

欢迎入群一起讨论

 

 



标签:文件,return,前端,file,const,上传,size
From: https://www.cnblogs.com/songsu/p/17755367.html

相关文章

  • git上传至公共或私有github
    1.下载gitbash参考链接:https://git-scm.com/download2.创建git的秘钥gitconfig--globaluser.name"githubname"gitconfig--globaluser.email"githubemail"ssh-keygen-trsa-C"githubemail"其中:githubname是你的名称,githubemail是你的邮箱3.添加de......
  • vconsole 前端调试神器,h5页面调试工具
    npminstallvconsole在需要的页面引入,并初始化<script> importVconsolefrom'vconsole'; exportdefault{ created(){ letvConsole=newVconsole(); } }</script>先安装vconsole组件,然后vue页面调用即可,注意一定要放在created方法里面。否则......
  • 前端网页sessionStorage对值的获取与传值
    前端网页sessionStorage对值的获取与传值sessionStorage主要在页面之间进行值得传输·允许跨页面。可以是单个值,以及JSON对象的传递,主要方法有这些sessionStorage[key]=val//保存一个数据sessionStorage.setItem(key,val)//保存一个数据varval=sessionStorage[key]//读取一个数......
  • 前端讲义10_HTTP Request header
    前端讲义10_HTTPRequestheader把Requestheader进行分类,比较清晰记忆。监控打开URLhttps://blog.csdn.net/msh2016Cache头域If-Modified-Since作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。......
  • Selenium借助AutoIt完成文件的上传与下载
    文件上传1,编辑首先提前下载好AutoIT,先了解https://blog.csdn.net/weixin_39218743/article/details/87808776手上没有带上传文件的网址,先用百度的上传照片吧!打开AutoIT工具组件中的脚本编辑器sciTEScriptEditorWinWaitActive("打开")Send('D:\img\11.jpg')Sleep(2000)Send("{......
  • 【PyQt6】Python窗口拖拽文件并响应的实现
    情景大概应用情景为:将一个文件拖入到窗口内,地址栏显示文件路径,文本框显示文件内容。说明实现拖拽必须在exec前设置QMineDate,否则不会开始拖拽操作。实现fromPyQt6.QtCoreimport*calssMainWindow(QMainWindow,Ui_MainWindow): def__init__(self): super().__init__......
  • Blob流在线预览PDF文件、图片
    这个要注意格式,要加上responseType:'arraybuffer'importaxiosfrom'axios'constfileTypeList=['application/pdf','image/png','image/gif','image/jpeg','txt/plain']invoicePreview(){......
  • 前端大文件上传方法
    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大,或者网络条件不好时,上传的时间会......
  • jmeter中查看结果树写入文件
     【所有数据写入一个文件】从本地选取文件夹后,可直接在后面添加上文件名称,如:Chatgpt_${__time(yyyyMMddHHmmss,)}.csv也可以写成:_${__time(yyyy-MM-ddHHmmss,)}.csv  (1)文件名(Filename):可以通过浏览,选择一个文件,这样jmeter在执行的过程中,会将所有的信息输出到文件,也支持......
  • 在hadoop虚拟机里面使用hadoop jar运行打包文件,出现Exception in thread "main" org.a
    问题描述更改了JDK版本之后,再次运行又出现了这个错误:问题解决经过查阅相关资料,发现是自己定义的hdfs的路径不太对,本来写的是这样的:然后自己确实不记得配置环境时配置的是多少,就看了看这个文件core.site.xml:catcore-site.xml然后看到这里:使用的端口号是8020,改成跟环境......