使用javascript将上载的文件拆分为多个块

使用javascript将上载的文件拆分为多个块,javascript,google-chrome,base64,compression,frontend,Javascript,Google Chrome,Base64,Compression,Frontend,我正在寻找一种方法,在作为多个文件上传之前,在浏览器前端拆分任何文本/数据文件。我的限制是每次上传40KB。因此,如果用户上传一个400KB的文件,在上传到服务器之前,它会在前端将该文件分成10个单独的块或10个单独的文件 目前,我正在将这个文件转换成base64格式的字符串,然后将这个字符串拆分为40KB,最后分成10个独立的块。从那里我上传每个区块,文件名为chunk-1-of-10,chunk-2-of-10 当下拉这些文件时,我只是将所有这些块缩回,并将其从base64解压为文件格式 有

我正在寻找一种方法,在作为多个文件上传之前,在浏览器前端拆分任何文本/数据文件。我的限制是每次上传40KB。因此,如果用户上传一个400KB的文件,在上传到服务器之前,它会在前端将该文件分成10个单独的块或10个单独的文件

目前,我正在将这个文件转换成base64格式的字符串,然后将这个字符串拆分为40KB,最后分成10个独立的块。从那里我上传每个区块,文件名为chunk-1-of-10,chunk-2-of-10

当下拉这些文件时,我只是将所有这些块缩回,并将其从base64解压为文件格式


有更好的方法吗?是否有一个库可以处理所有这些,而不是从头开始编写?我不确定base64路由是否是最好的方法

使用
文件读取器
然后作为二进制文件发送,可以避免base64编码:

consturl='1〕http://www.example.com/upload';
document.getElementById('file-uploader')。addEventListener('change',函数(e){
常数大小=40000;
var reader=new FileReader();
var buf;
var file=document.getElementById('file-uploader').files[0];
reader.onload=函数(e){
buf=新的UINT8阵列(例如,target.result);
对于(变量i=0;i

无需使用FileReader将内容读入ram 使用base64只会增加需要上传的内容的大小

用于获取块

// simulate a file from a input
const file = new File(['a'.repeat(1000000)], 'test.txt')

const chunkSize = 40000
const url = 'https://httpbin.org/post'

for (let start = 0; start < file.size; start += chunkSize) {
  const chunk = file.slice(start, start + chunkSize + 1)
  const fd = new FormData()
  fd.append('data', chunk)

  await fetch(url, {method: 'post', body: fd}).then(res => res.text())
}
//从输入模拟文件
常量文件=新文件(['a'。重复(1000000)],'test.txt')
常量chunkSize=40000
常量url=https://httpbin.org/post'
for(让start=0;start
感谢您提供的解决方案!对此的一个快速添加是在slice()的第二个参数中添加“start”,以获得后续的块。const chunk=file.slice(start,start+chunkSize+1)。我们如何输出服务器响应?@ParsaYazdani
console.log(等待fetch(url,{method:'post',body:fd})。然后(res=>res.text())
这对我们很有效,但是,我们不得不做一个小的调整,在计算chunk时删除+1:
const chunk=file.slice(start,start+chunkSize)
我们如何输出服务器响应?