首页 > 其他分享 >前端大文件分片上传

前端大文件分片上传

时间:2023-05-21 09:44:51浏览次数:28  
标签:function start 前端 xhr let file 分片 上传 chunk

前端大文件分片上传需要将文件切割成若干个片段,然后将每个片段上传到服务器,最终在服务端将所有的片段合并成完整的文件。下面是一个前端大文件分片上传的示例:

  1. 将文件切割成若干个片段。
function splitFile(file, chunkSize) {
  let fileSize = file.size;
  let start = 0;
  let chunkIndex = 0;
  let chunks = [];

  while (start < fileSize) {
    let end = Math.min(fileSize, start + chunkSize);
    let chunk = file.slice(start, end);
    chunks.push({
      index: chunkIndex,
      start: start,
      end: end,
      file: chunk
    });
    chunkIndex++;
    start = end;
  }

  return chunks;
}
  1. 上传每个片段,使用XMLHttpRequest对象上传。
function uploadChunk(url, chunk, callback) {
  let xhr = new XMLHttpRequest();
  xhr.open("POST", url, true);
  let formData = new FormData();
  formData.append("chunkIndex", chunk.index);
  formData.append("start", chunk.start);
  formData.append("end", chunk.end);
  formData.append("file", chunk.file);
  xhr.onload = function() {
    callback(xhr.status === 200);
  };
  xhr.send(formData);
}
  1. 服务端接收片段。
const express = require("express");
const app = express();
const multer = require("multer");

let storage = multer.diskStorage({
  destination: function(req, file, callback) {
    callback(null, "./uploads");
  },
  filename: function(req, file, callback) {
    callback(null, file.originalname + "_" + req.body.chunkIndex);
  }
});

let upload = multer({ storage: storage }).single("file");

app.post("/upload", function(req, res) {
  upload(req, res, function(err) {
    if (err) {
      res.status(500).send({ message: err.message });
    } else {
      res.status(200).send({ message: "Uploaded successfully" });
    }
  });
});

app.listen(8080);
  1. 合并所有片段。
function mergeChunks(url, fileName, chunkCount, callback) {
  let xhr = new XMLHttpRequest();
  xhr.open("GET", url + "?fileName=" + fileName + "&chunkCount=" + chunkCount, true);
  xhr.onload = function() {
    callback(xhr.status === 200);
  };
  xhr.send();
}
  1. 客户端在上传完所有片段后,将所有片段合并成完整的文件。
let chunkSize = 5 * 1024 * 1024; //每个片段5MB

let file = document.getElementById("file").files[0];
let chunkCount = Math.ceil(file.size / chunkSize);
let chunks = splitFile(file, chunkSize);

let uploadedCount = 0;
for (let i = 0; i < chunks.length; i++) {
  const chunk = chunks[i];
  uploadChunk("/upload", chunk, function(success) {
    uploadedCount++;
    if (uploadedCount === chunkCount) {
      mergeChunks("/merge", file.name, chunkCount, function(success) {
        console.log("File upload " + (success ? "completed" : "failed"));
      });
    }
  });
}

注意,以上代码仅供参考,不同浏览器和服务器可能会有不同的兼容性问题,实际应用时需要进行充分测试和优化。

标签:function,start,前端,xhr,let,file,分片,上传,chunk
From: https://www.cnblogs.com/kitebear/p/17418216.html

相关文章

  • MyCat16——分片规则之全局序列
     1主键重复之前创建了PAYMENT_ADDRESS数据表,根据area\_id的值,进行分片设置。那么在实际使用当中,虽然我们在建表时将id字段设置为了主键,但该主键的作用域仅在单个分片的数据库中起作用。当数据被分到不同的数据库分片中,该设置就会失去作用了。我们的分片规则是:100000-300000......
  • Git Bash 上传本地文件到Gitee(AI助力解决问题)
    前言(PS:文章前言由Chatgpt所写)Gitee是一个基于Git的代码托管和开发协作平台,它提供了代码仓库、代码审查、持续集成/持续部署(CI/CD)、项目管理、问题跟踪等功能。用户可以在Gitee上创建自己的代码仓库,上传代码并与团队成员协作开发。GitBash是一个基于Git的命令行工具,它允......
  • 前端02
    1、请写出表单中代表单选框的标签radio<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"......
  • 10. CMDB前端开发-IDC管理
    10.CMDB前端开发-IDC管理CMDB前端开发-IDC管理IDC管理首先需要将布局做一下调整,目录结构如下删除原先的A~C.vue文件,修改router/index.js路由文件如下:...constroutes=[{path:'/login',name:'登录',component:()=>import('../views/Login.vu......
  • 前端个人体系
    栈内技术前端工具GitGit基本操作GitFlowVScodeChromeDevToolsNpmyarnpnpmAPIfox编程知识储备浏览器基础计算机网络浏览器渲染原理跨域浏览器存储数据结构堆栈、队列、数组链表、树、图算法排序算法、去重递归、回溯设计模......
  • 常见前端安全问题总结
    一、XSS攻击全称跨站脚本攻击,简称XSS攻击,攻击者通过在目标网站上HTML注入篡改网页来插入恶意脚本,当用户在浏览网页时获取用户的cookie等敏感信息,进一步做一些其他危害的操作。根据攻击的来源,该攻击还可以分为:1)存储型攻击:一般是在有评论功能的网站将恶意代码当作评论内容存储到......
  • 前端三要素
    HTML、CSS、js是构建网页的三种主要技术,也被称为前端技能三要素。 1.HTML:超文本标记语言是一种使用标签(标记)描述网页的语言;结构层;是一种标记语言 2.CSS:层叠样式表主要用于美化web页面外观表现层/样式层样式表语言 3.JavaScript:简称JS,用于网页交互的解释性脚本语......
  • 1. react项目【前端】+C#【后端】从0到1
    1、创建前端基础框架 1.1前端创建软件: 1.1.1npxcreate-react-apppcps:pc是文件名; 1.1.2npmstart启动项目 2、创建后端基础框架软件: 2.1创建webapi项目  Program.cs是启动文件;  ......
  • 前端如何将项目部署到服务器(Nginx)
    一、准备环境1、服务器或者虚拟机(后端已经搭建好的,这里就不讲述如何搭建服务器了)2、Xshell和Xftp-->存放静态文件和操作服务器3、Windows系统Xshell:是一个强大的安全终端模拟软件,可以在Windows界面下用来访问远端不同系统下的服务器。(作用就是用来连接远程服务器的)Xftp:是一......
  • 如何从typora上传到博客园
    参考b站博主的教程:https://www.bilibili.com/video/BV1Rv4y1Y7KH?p=5&vd_source=8a113d1251cad4a02d89fab4699c47961安装几个软件(1)打开控制面板->程序和功能->启用或关闭Windows功能->勾选.NETFramework3.5,进行安装;(2)安装dotnet-sdk-5.0.408-win-x64;(3)安装Typora2准备工作......