1.0.3 • Published 3 years ago

chunk-up v1.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

一个开箱即用的切片上传工具, 支持断点续传, 并发控制, 采用worker线程计算hash, 保证性能的同时, 保证准确性.

Usage

npm install chunk-up
import chunkUp from 'chunk-up'

// chunkUp 将返回一个实例
const uploadTask = chunkUp({
    chunkRequset: chunkRequset, 
    beforeUpload: verifyUpload,
    uploaded: mergeRequest, 
    file: container.file, 
})

e.g.

@todo 原生例子

chunkUp的参数配置表

NameDescriptionDefault
chunkRequsetrequired 分片上传的接口null
beforeUpload上传前被调用的钩子, 要求返回一个对象, 值分别为: {shouldUpload: boolean uploadedList: array}null
uploaded分片上传结束即调用该函数, 一般用于发送切片合并请求null
filerequired 目标文件对象, 一般在input标签事件中获取到null
allCal是否全量计算hash, 默认情况下文件的hash值是抽样计算的, 这是牺牲一点准确率下的性能优化, 当然你完全可以使用全量计算false
concurNum并发数, 即一次性发起多少个请求4
size单个切片的大小10MB

chunkRequset

chunkRequset要求必传, 它需要返回一个promise对象, 并且将接受到两个参数formData, onPregess函数. 你可以像这个案例一样书写, 这将完美运行.

  • formData是切块的表单数据

  • onProgress是一个进度条函数, 在为xhr提供实时的进度条变化(但是目前这个功能还有些问题@todo)

async function chunkRequset(formData, onProgress) {
  return await request({
    url: 'http://localhost:8080',
    formData,
    onProgress
  })
}

beforeUpload

beforeUpload非必传, 它默认接收到hashFilename, hash 2个参数, 方便你发送验证请求.

  • hashFilename 经过文件hash + 原文件扩展名拼接而成, 用于向后端验证当前文件是否存在
  • hash 作用同上, 由于存在未生成文件, 而是一个切片文件夹的情况, 可能需要hash进行验证

请在这个函数中返回一个对象: { shouldUpload: boolean, uploadedList: hashString[] }

  • shouldUpload: 是一个布尔值, true表明需要上传, false表明不需要, 如果你在这个字段中返回 false, chunkUp将中断上传任务的执行
  • uploadedList: 已切片名字数组, 用于校验哪些切片是否已经上传, 在上传阶段, 切片的名字将已 hash + '-' + 切片数 的形式发送给后端. 后端只需要将已上传的切片名通过数组返回即可.

例如: 我们上传 demo.mp3 这个文件, 计算完hash, 它就会被切片

demo.mp3 计算 hash => 12asd9058asasjf.mp3

它的切块:
  12asd9058asasjf-1
  12asd9058asasjf-2
  12asd9058asasjf-3

我们上传完, 切片1, 切片2的时候暂停了, 之后要恢复重传, 就需要后端返回uploadedList了, 这个uploadedList数组应该长这样:

uploadedList = [
  '12asd9058asasjf-1',
  '12asd9058asasjf-2'
]

根据这个数组, chunkUp就会跳过这两个切片的上传

uploaded

uploaded 非必传, 一般用于切片上传完毕后, 发送合并请求, 它将接收到4个参数fulfilled, hashFilename, size, fileHash

  • fulfilled: 将告知你, 当前切片上传是否正常, 你可以根据这个判断是否要发送合并请求
  • hashFilename: hash文件名
  • size: 切块大小
  • fileHash: 文件hash

file

file 必传, 要求是一个文件对象, 一般在input标签获取. 比如:

<body>
    <input type="file" id="uploadFile">
    <script>
        uploadFile.addEventListener('change', function (e) {
            const [file] = e.target.files // 文件对象
            // 一般也在这个位置使用 chunkup
        })
    </script>
</body>

chunkUp实例

uploadTask.on执行后将完成文件的切片工作和hash计算工作, 并返回一个fileChunk数组, 提供每个切片的基本信息, 包括进度条等.

const fileChunk = uploadTask.on()

uploadTask.send执行后正式发起请求, 上传切片

uploadTask.send()

todo

  1. 慢启动策略
  2. 重传错误切片配置
  3. 断点续传
  4. jest(待定...)
1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago