首页 > 其他分享 >js实现文件分片上传

js实现文件分片上传

时间:2023-10-09 13:44:07浏览次数:41  
标签:片段 const js xhr file 分片 chunks 上传

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>文件分片上传</title>
</head>

<body>
<input type="file" id="fileInput">
<button id="uploadButton">Upload</button>
<progress id="progressBar" value="0" max="100"></progress>
</body>
<script>
const fileUploader = {
// 将文件切分为指定大小的片段
splitFile: function (file, chunkSize) {
const chunks = []; // 存储切分后的片段数组
let offset = 0; // 当前片段的偏移量

while (offset < file.size) {
const chunk = file.slice(offset, offset + chunkSize); // 切分片段
chunks.push(chunk); // 将切分后的片段添加到数组中
offset += chunkSize; // 更新偏移量,准备切分下一个片段
}

return chunks; // 返回切分后的片段数组
},

// 上传单个片段
uploadChunk: function (chunk, url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest(); // 创建 XMLHttpRequest 对象
xhr.open('POST', url); // 打开 POST 请求
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.response); // 上传成功,将响应传递给 Promise 的 resolve 函数
} else {
reject(new Error(xhr.statusText)); // 上传失败,将错误信息传递给 Promise 的 reject 函数
}
};
xhr.onerror = () => {
reject(new Error('Network error')); // 网络错误,将错误信息传递给 Promise 的 reject 函数
};
xhr.send(chunk); // 发送片段数据
});
},

// 处理上传响应
handleUploadResponse: function (response) {
// 处理服务器的响应
if (response.success) {
// 上传成功,继续上传下一个片段
this.uploadNextChunk();
} else {
// 上传失败,进行错误处理
console.error(response.error);
}
},
/**
* 初始化文件选择输入框、上传按钮和进度条的元素
* @param {string} fileInputId - 文件选择输入框的 id
* @param {string} uploadButtonId - 上传按钮的 id
* @param {string} progressBarId - 进度条的 id
* @param {string} uploadUrl - 上传文件的 URL(接口)
*/
init: function (fileInputId, uploadButtonId, progressBarId, uploadUrl) {
// 获取文件选择输入框、上传按钮和进度条的 DOM 元素
const fileInput = document.getElementById(fileInputId);
const uploadButton = document.getElementById(uploadButtonId);
const progressBar = document.getElementById(progressBarId);

let file; // 选中的文件
let chunkSize = 1024 * 1024; // 每个片段的大小,这里设置为 1MB

let chunks; // 文件切分后的片段数组
let currentChunkIndex = 0; // 当前上传的片段索引

// 监听文件选择输入框的变化
fileInput.addEventListener('change', () => {
file = fileInput.files[0]; // 获取选择的文件
});

// 监听上传按钮的点击事件
uploadButton.addEventListener('click', () => {
if (!file) {
console.error('Please select a file');
return;
}

// 将文件切分为片段
chunks = this.splitFile(file, chunkSize);

// 重置当前片段索引和进度条
currentChunkIndex = 0;
progressBar.value = 0;

// 开始上传第一个片段
this.uploadNextChunk(uploadUrl);
});

// 上传下一个片段
this.uploadNextChunk = function () {
if (currentChunkIndex < chunks.length) {
const chunk = chunks[currentChunkIndex];

// 上传当前片段
this.uploadChunk(chunk, uploadUrl)
.then(this.handleUploadResponse.bind(this))
.catch(error => {
console.error(error);
});

// 更新当前片段索引和进度条
currentChunkIndex++;
progressBar.value = (currentChunkIndex / chunks.length) * 100;
} else {
// 所有片段上传完成,进行合并操作或其他处理
console.log('All chunks uploaded');
}
};
}
};

// 使用示例
fileUploader.init('fileInput', 'uploadButton', 'progressBar', '/upload');
</script>

</html>

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/09/js%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0-2/

欢迎入群一起讨论

 

 

标签:片段,const,js,xhr,file,分片,chunks,上传
From: https://www.cnblogs.com/songsu/p/17751522.html

相关文章

  • js函数,js对象
    1定义一个函数21.functionfuctionName(参数1,参数2){3//要执行的代码4return要返回的结果5}6782.varfunctionName=function(a,b)91011ES6箭头函数:(...)=>{...}12arr.forEach((e)=>{13console.log(e);14})基础对象模......
  • WebForm后端调用前端JS
    /*注意:定义的js方法一定要放在head里面,不能放下面,否则不生效*/<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="WebForm1.aspx.cs"Inherits="WebFormBackEndCallFrontJsDemo.WebForm1"%><!DOCTYPEhtml><htmlxmlns=&qu......
  • js实现分片上传文件
    <template><div><inputtype="file"@change="fileEvent"/></div></template><script>importaxiosfrom"axios";exportdefault{data(){return{size:1*......
  • 【webapp】jsp EL 的基本语法和用法
    EL(表达式语言)是用于在JSP页面中访问和操作数据的简洁表达式语言。EL提供了一种简化和统一的方式来访问变量、属性、集合和其他对象。以下是EL的基本语法和用法:基本语法:${expression}:用于在JSP页面中嵌入EL表达式。${object.property}:访问对象的属性。${map.key}:访......
  • 【webapp】jsp 操作数据库
    在JSP中连接和操作数据库需要使用Java的JDBC(JavaDatabaseConnectivity)API。下面是学习在JSP中使用JDBC连接和操作数据库的基本步骤:导入JDBC驱动程序:下载并导入适合您所使用的数据库的JDBC驱动程序JAR文件。不同的数据库有不同的驱动程序。将JDBC驱动程......
  • 【webapp】在 JSP 页面中引入标签库和使用自定义标签
    自定义标签的基本步骤:创建自定义标签库文件:首先,您需要创建一个包含自定义标签定义的标签库文件(通常以 .tld 扩展名结尾)。该文件描述了标签的名称、属性和处理逻辑。引入标签库:在JSP页面中,通过使用 <%@taglib%> 指令来引入自定义标签库。该指令告诉JSP引擎在页面中......
  • js数组转字符串方法(转)
    JavaScript 允许数组与字符串之间相互转换。其中Array 方法对象定义了3 个方法,可以把数组转换为字符串,如表所示。数组方法说明toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串......
  • 基于Node.js的大文件分片上传
    我们在做文件上传的时候,如果文件过大,可能会导致请求超时的情况。所以,在遇到需要对大文件进行上传的时候,就需要对文件进行分片上传的操作。同时如果文件过大,在网络不佳的情况下,如何做到断点续传?也是需要记录当前上传文件,然后在下一次进行上传请求的时候去做判断。前端1.index.ht......
  • 【webapp】JSP 内置对象
    request:表示客户端的请求信息,可以用于获取请求参数、请求头、请求方法等。response:代表服务器对客户端的响应,可以用于设置响应头、响应内容等。out:是一个输出流对象,可以用于向客户端输出内容。session:表示用户的会话,可以用于在不同的页面之间共享数据。application:代表整个应......
  • 【webapp】JSP页面间跳转和包含
    在JSP中,有两种常见的页面间跳转和包含方式:转发(forward)和包含(include)。转发(Forwarding):通过转发,一个页面可以将请求转发给另一个页面进行处理,然后由该页面生成响应。转发是在服务器端完成的,客户端并不知道实际的页面地址。使用转发的语法是 request.getRequestDispatcher("......