react input[type=“file”] 上传------分片上传(对文件进行切割)
@{
ViewData["name"] = "大文件分片上传";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
<input name="file" class="file" type="file" />
<input id="submit" type="button" value="分片上传" class="btn-submit" />
</div>
<script>
window.onload = function () {
let btnSubmit = document.querySelector('.btn-submit')
btnSubmit.addEventListener('click', () => {
UploadAsync()
})
}
async function UploadAsync() {
let file = document.querySelector('.file').files[0]
let fileChunks = []
let maxFileSize = 8
let bufferChunkSize = maxFileSize * (1024 * 1024)
let fileStreamPos = 0
let endPos = bufferChunkSize
let size = file.size
while (fileStreamPos < size) {
let fileChunkInfo = {
file: file.slice(fileStreamPos, endPos),
start: fileStreamPos,
end: endPos
}
fileChunks.push(fileChunkInfo)
fileStreamPos = endPos
endPos = fileStreamPos + bufferChunkSize
}
let totalParts = fileChunks.length
let partCount = 0
while (chunk = fileChunks.shift()) {
partCount++
let filePartName = file.name + ".partNumber-" + partCount
chunk.filePartName = filePartName
let url = `partNumber=${partCount}&chunks=${totalParts}&size=${bufferChunkSize}&start=${chunk.start}&end=${chunk.end}&total=${size}`
chunk.urlParameter = url
UploadFileChunk(chunk)
}
}
function UploadFileChunk(chunk) {
let formData = new FormData()
formData.append('file', chunk.file, chunk.filePartName)
fetch('/Upload/chunk?' + chunk.urlParameter, {
method: 'post',
body: formData
}).then(res => {
console.log(res)
})
}
</script>