大文件切片上传+断点续传解决方案-前后端实现(附源码)

这篇具有很好参考价值的文章主要介绍了大文件切片上传+断点续传解决方案-前后端实现(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上传文件大家应该都做过,前端直接把file文件传给后端就ok了,但是大文件这样传就会造成页面假死,体验极差。如果遇到网络不稳定的时候,中途上传失败的话,又要从头开始传,本来文件就大,还慢。所以今天我们用一种新方法-切片上传+断点续传

前端实现:

页面上很简单,我就放了进度条和一个上传文件组件,你可以按照三方ui来进行替换

    <div class="box">
        <progress value="0"></progress>
        <br />
        <input type="file" text="选择文件"/>
    </div>

 主要看逻辑实现

1、获取页面元素,初始化变量(vue中获取元素使用ref即可)

let ipt = doc.querySelector("input");
let progress = doc.querySelector("progress");
const chunkSize = 64 * 1024; //切片大小
let uploaded = 0; //已上传多少

2、 input绑定change事件(如果有专门的上传按钮,就给按钮绑定点击事件,如下图2)

思路:

  • 通过read函数,把blob文件转为字符串,然后打成MD5
  • 然后设置进度条的max为文件的size
  • 判断缓存中是否有上传的进度,有就把切片初始值设置缓存中的值
  • 设置循环,当前上传的大小 < 文件size时,进行切片,使用file.slice(起始值,起始值 + 切片大小)
  • 把当前切片append进formdata,然后传给后端
  • 然后把修改切片起始值,设置缓存进度,设置进度条当前值
  // blob转为为字符串
  const read = (file) => {
    let reader = new FileReader();
    return new Promise((resolve, reject) => {
      reader.onload = function (event) {
        const arrayBuffer = event.target.result;
        resolve(arrayBuffer);
      };
      reader.onerror = reject;
      reader.readAsBinaryString(file);
    });
  };

 ipt.addEventListener("change", async (event) => {
    let file = event.target.files[0];
    if (!file) {
      return;
    }
    ipt.value = null;
    let content = await read(file);
    let hash = md5(content);//转成hash,保证文件唯一
    let { size, name, type } = file;
    const local = localStorage.getItem(uploaded);//断点重传标志
    progress.max = size;
    if (local) {
      uploaded = Number(local);
    }
    while (uploaded < size) {
      //切片大小
      const chunk = file.slice(uploaded, uploaded + chunkSize, type);
      let fd = new FormData();
      fd.append("name", name);
      fd.append("size", size);
      fd.append("type", type);
      fd.append("file", chunk);
      fd.append("offset", uploaded);
      fd.append("hash", hash);
      try {
        await axios.post("http://localhost:5454/upload", fd);
      } catch (error) {
        console.log("上传失败");
      }

      uploaded += chunkSize;
      localStorage.setItem(uploaded, uploaded);//设置传递进度
      progress.value = uploaded;
    }
    console.log("上传成功");
  });
btn.addEventListener('click',async()=>{
    let file = ipt.files[0]
})

后端实现:

思路:

  • 利用express-fileupload插件后,file在req.files中取,其他数据在req.body取
  • 设置文件名,利用extreme获取传来的文件的后缀名,拼接在跟目录的upload文件夹下
  • 判断offset != 0,就是已上传但是本地没有文件,创建文件并写入,否则写入到已经存在的文件中
//app.js
const express = require("express");
const bodyParser = require("body-parser");
const fileUpload = require("express-fileupload");
const { resolve, extname } = require("path");
const { existsSync, appendFileSync, writeFileSync } = require("fs");

const app = express();
const PORT = "5454";

// 跨域
app.all("*", (req, res, next) => {
  res.header("Access-Control-Allow-origin", "*");
  res.header("Access-Control-Allow-Methods", "POST,GET");
  next();
});

app.use(bodyParser.json());
app.use(fileUpload());
app.use('/',express.static('upload'))

// app.get("/", (req, res) => {
//   res.send("Hello World!");
// });

app.post("/upload", (req, res) => {
  const { name, size, type, offset, hash } = req.body;
  const { file } = req.files;
  // console.log(name, size, type, offset, hash);
  //取后缀
  let ext = extname(name);
  let fileName = resolve(__dirname, "./upload/" + hash + ext);
  if (offset != 0) {
    if (!existsSync(fileName)) {
      res.status(400).send({
        msg:'文件不存在'
      })
      return
    }
    appendFileSync(fileName,file.data)
    res.send({
      code:200,
      data:'http://localhost:5454/' + fileName,
      msg:'文件写入成功'
    })
    return
  }
  writeFileSync(fileName, file.data);
    res.send({
      code: 200,
      msg: "文件创建并写入成功",
    });
});

app.listen(PORT, () => {
  console.log(`server running in ${PORT}`);
});

以上就实现了大文件上传的基本方法,像文件类型校验啥的可自行扩展,本demo只是基本示例,如有更好的方法,可在评论区留下讨论,共同进步~

源码地址:大文件上传: 大文件上传demo 文章来源地址https://www.toymoban.com/news/detail-704604.html

到了这里,关于大文件切片上传+断点续传解决方案-前后端实现(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1. 大文件上传如何断点续传

    文件分片 - 将文件分割成多个小块,以便于上传和管理。 计算文件以及分片文件的Hash值 - 生成唯一标识符 - 通过计算文件及其分片的Hash值来创建一个唯一的标识符。 上传分片 - 根据标识符判断分片文件上传状态 - 避免重复上传。 如果上传中断,下次上传时根据标识符跳过

    2024年04月22日
    浏览(33)
  • 上传视频文件,基于断点续传(整合Minio)

    目录 1、什么是断点续传 2、分块文件 3、合并文件 4、 Minio 分布式文件系统整合断点续传 4.1 进行文件分块上传到 Minio  4.2 进行 Minio 中分块文件的合并 5、使用 Minio 进行断点续传的注意事项           相信很多小伙伴在上传下载图片或者视频的时候,突然间(没错就是这

    2024年02月11日
    浏览(47)
  • Minio大文件分片上传、断点续传实现

    使用minio api实现分片上传及断点续传功能。 前端准备:获取大文件的MD5值,将文件分片,5M为一分片,排好顺序,并按顺序命名(1,2,3这种后面比较好合并) 在上传分片阶段,前端有上传进度条 1、检验文件MD5值 1.1 redis中查看MD5是否存在 1.2 判断临时文件夹是否存在 boolean d

    2024年02月09日
    浏览(53)
  • spring boot 阿里云oss 文件分片上传、断点续传

    文章目录 前言 一、申请阿里云oss 二、上代码 总结       阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。     您可以使用阿

    2024年02月07日
    浏览(49)
  • 大文件上传阿里云oss,分片、断点续传进度条展示

    前端页面展示 大文件如果不采用分片上传会导致卡死、内存占用过高导致程序奔溃等一些列问题。 通常在文件大于100 MB的情况下,建议采用分片上传的方法,通过断点续传和重试,提高上传成功率。如果在文件小于100 MB的情况下使用分片上传,且partSize设置不合理的情况下,

    2024年02月11日
    浏览(45)
  • minio&前后端分离上传视频/上传大文件——前后端分离断点续传&minio分片上传实现

    🍀🍀🍀🍀分布式文件系统-minio: 第一章:分布式文件系统介绍与minio介绍与使用(附minio java client 使用) 第二章:minio前后端分离上传视频/上传大文件——前后端分离断点续传minio分片上传实现 断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包

    2024年02月03日
    浏览(54)
  • 【SpringBoot整合系列】SpringBoot 实现大文件分片上传、断点续传及秒传

    小文件(图片、文档、视频)上传可以直接使用很多ui框架封装的上传组件,或者自己写一个input 上传,利用FormData 对象提交文件数据,后端使用spring提供的MultipartFile进行文件的接收,然后写入即可。 但是对于比较大的文件,比如上传2G左右的文件(http上传),就需要将文件

    2024年04月16日
    浏览(67)
  • springboot整合vue2-uploader文件分片上传、秒传、断点续传

    vue-simple-uploader 是基于 simple-uploader.js 封装的vue上传插件。它的优点包括且不限于以下几种: 支持文件、多文件、文件夹上传;支持拖拽文件、文件夹上传 可暂停、继续上传 错误处理 支持“秒传”,通过文件判断服务端是否已存在从而实现“秒传” 分片上传 支持进度、预估

    2024年02月06日
    浏览(60)
  • 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传

    1. 前言 文件上传 小文件(图片、文档、视频)上传可以直接使用很多ui框架封装的上传组件,或者自己写一个input 上传,利用FormData 对象提交文件数据,后端使用spring提供的MultipartFile进行文件的接收,然后写入即可。但是对于比较大的文件,比如上传2G左右的文件(http上传

    2024年02月06日
    浏览(48)
  • 老大加需求:做一个支持超大文件 HTTP 断点续传的上传服务,我懵逼了~

    作者: 大飞飞鱼 来源: blog.csdn.net/ababab12345/article/details/80490621 最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件(大都数是4GB以上)的http上传,并且要求支持http断点续传。笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包