0.1.0 • Published 4 years ago

big-upload v0.1.0

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

big-upload

使用 TypeScript 实现大文件分片上传

使用

基本使用方法:

import upload from 'big-upload'

// upload(el: string | element, action: string, config?: object)
upload('#el', '/upload')

// 或者

// upload(config: object)
upload({
  el: '#el',
  action: '/upload'
})

如果你不需在选取文件后立即进行上传,而是点击按钮上传,你应当使用 .submit():

import upload from 'big-upload'

const ul = upload({
  el: '#el',
  action: '/upload',
  autoUpload: false
})

document.querySelector('#btn').onclick = () => {
  ul.submit()
}

API

config 配置

参数说明类型默认值
el必选参数,绑定元素string / element--
action必选参数,上传的地址string--
data上传时附带的额外参数object--
paramsurl地址参数object / URLSearchParams--
name上传的文件字段名stringfile
chunkSize设置每个文件分片大小number1 * 1024 * 1024
multiple是否支持多选文件booleanfalse
accept接受上传的文件类型string--
autoUpload是否在选取文件后立即进行上传booleantrue
withCredentials支持发送 cookie 凭证信息booleanfalse
headers设置上传的请求头部object--
timeout设置超时时间number0
httpRequest覆盖默认的上传行为,可以自定义上传的实现function--
onChange选择文件后钩子function(fileData[])--
onBeforeUpload上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise.resolve(false),则停止上传function(fileData)--
onBeforeSliceFileUpload上传分片文件之前的钩子,参数为上传的分片文件,若返回 false 或者返回 Promise.resolve(false),则停止上传(表示该分片文件已上传成过,无需再上传)function(fileData)--
onProgress文件上传时的钩子function(progressData)--
onSuccess单个文件上传成功时的钩子(表示该文件的所有分片文件已全部上传成功)function(response[], fileData, file)--
onComplete所有文件上传成功时的钩子(表示所有文件的所有分片文件已全部上传成功)function(responseList, fileData[], file[])--
onError分片文件上传失败时的钩子function(err, sliceFile, file)--
isLocalRecord是否开启本地上传记录,开启后每上传完一个分片文件时,会在 localStorage 中记录,直到当前文件的所有分片文件全部上传完毕,删除当前记录booleanfalse
localRecordTime开启本地上传记录后,设置保存每个文件的记录时长为多少天number15 天
onLocalRecord开启本地上传记录后,当上传文件的分片文件时,命中本地上传记录,不需要再上传前调用该钩子,若返回 false 或者返回 Promise.resolve(false),则停止上传(表示该分片文件已上传成过,无需再上传)function(fileData)--
isAddUp是否开启叠加文件,当设置 config.autoUploadfalse 并开启此选项时,选择的文件会进行叠加,并在 onChange 钩子中返回所有叠加文件(如果选择文件的文件名一样时,会保留第一个选择的文件,因为要以文件名和内容生成唯一的 md5 值 )booleanfalse

requestData: object (上传分片文件时,默认请求入参)

字段说明类型
name文件名称string
size文件大小number
hash文件生成唯一的 md5 值string
totalCount文件可分片个数number
index当前上传分片文件的索引值number
file当前上传的分片文件,可通过 config.name 设置上传的文件字段名file / blob
currentSize当前上传的分片文件大小number
currentHash当前上传的分片文件生成唯一的 md5 值string

钩子参数说明

fileData: object

name说明类型
name文件名称string
size文件大小number
file上传文件file
hash文件生成唯一的 md5 值string
totalCount文件可分片个数number
index当前上传分片文件的索引值number
currentFile当前上传的分片文件file / blob
currentSize当前上传的分片文件大小number
currentHash当前上传的分片文件生成唯一的 md5 值string
import upload from 'big-upload'

upload({
  el: '#el'
  action: '/upload',
  onBeforeUpload(fileData) {
    console.log(fileData)
  }
})

/* `xx?` 参数是针对分片文件内容,所以在 `onChange`、`onBeforeUpload` 钩子中不会有此参数
fileData: {
  name: string,
  size: number,
  file: file,
  hash: string,
  totalCount: number,
  index?: number,
  currentFile?: file / blob,
  currentSize?: number,
  currentHash?: string
}
*/

progressData: object

name说明类型
name文件名称string
size文件大小number
file上传文件file
hash文件生成唯一的 md5 值string
totalCount文件可分片个数number
index当前上传分片文件的索引值number
currentFile当前上传的分片文件file / blob
currentSize当前上传的分片文件大小number
currentHash当前上传的分片文件生成唯一的 md5 值string
loaded当前上传的分片文件,已上传的大小number
total当前上传的分片文件,需要上传的总共大小number
percent文件的上传进度number
import upload from 'big-upload'

upload({
  el: '#el'
  action: '/upload',
  onProgress(progressData) {
    console.log(progressData)
  }
})

/*
progressData: {
  name: string,
  size: number,
  file: file,
  hash: string,
  totalCount: number,
  index: number,
  currentFile: file / blob,
  currentSize: number,
  currentHash: string,
  loaded: number,
  total: number,
  percent: number
}
*/

response: object

name说明类型
data接口返回的响应数据object / any
status响应状态码number
statusText响应状态文字string
headers响应头object
config传入的 config 配置object
requestXMLHttpRequest 请求object
import upload from 'big-upload'

upload({
  el: '#el'
  action: '/upload',
  onSuccess(response, fileData, file) {
    console.log(response)
  }
})

/* 返回多个分片文件的响应报文集合(分片文件的上传个数是根据上传文件的大小,和设置 `config.chunkSize` 的大小计算而得出结果)
response: [
  {
    data: object / any,
    status: number,
    statusText: string,
    headers: object,
    config: object,
    request: object
  },
  ...
]
*/

Methods

方法说明参数
submit上传已选中的文件--
abort取消文件上传请求(val: 可以是 file 文件,或者是 hash 文件生成唯一的 md5 值)
remove删除已选中的文件(val: 可以是 file 文件,或者是 hash 文件生成唯一的 md5 值)
disabled是否禁用(val?: 不传值为禁用;传 true 为禁用;传 false 为不禁用)
import upload from 'big-upload'

let fileDataList

const ul = upload({
  el: '#el',
  action: '/upload',
  autoUpload: false,
  onChange(fileData) {
    fileDataList = fileData
  }
})

document.querySelector('#btnSubmit').onclick = () => {
  ul.submit()
}

document.querySelector('#btnAbort').onclick = () => {
  if(fileDataList && fileDataList.length) {
    ul.abort(fileDataList[0].hash)
    fileDataList.shift()
  }
}

document.querySelector('#btnRemove').onclick = () => {
  if(fileDataList && fileDataList.length) {
    ul.remove(fileDataList[0].hash)
    fileDataList.shift()
  }
}

document.querySelector('#btnDisabled').onclick = () => {
  ul.disabled()
}