<el-upload class="upload-demo" ref="upload" :file-list="fileList" :auto-upload="false" :limit="1" :on-change="handleChange">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
</el-upload>
data(){
return{
oneId:'',//编号
splitCount:'',//数目
chunkList:null,//全部切片文件
fileMd5:'',//唯一标识码
}
},
handleChange(uploadFile) {
// 文件信息
let fileRaw = uploadFile.raw
console.log(fileRaw)
// 获取 文件的 MD5唯一标识码
let fileMd5 = null
try {
fileMd5 = "111"
} catch(e) {
console.error('[error]', e)
}
if(!fileMd5) return
// 每片的大小为 5M 可调整
const chunkSize = 5 * 1024 * 1024
// 文件分片储存
let chunkList = []
function chunkPush(page = 1) {
chunkList.push(fileRaw.slice((page - 1) * chunkSize, page * chunkSize))
if(page * chunkSize < fileRaw.size) {
chunkPush(page + 1)
}
}
chunkPush()
this.chunkList = chunkList;
this.fileMd5 = fileMd5;
this.fileRawName = fileRaw.name;
},
submitUpload() {
for(let i = 0; i < this.chunkList.length; i++) {
let formData = new FormData()
formData.append('orderNo', i) // 当前片段的索引
formData.append('chunkSize', 5 * 1024 * 1024) // 切片的文件分片大小 (就是以多少字节进行分片的,这里是5M)
formData.append('splitCount', this.chunkList.length) // 共有多少分片
formData.append('file', this.chunkList[i]) // 当前分片的文件流
formData.append('fileNo', this.fileMd5) // 整个文件的唯一标识码,不是分片
formData.append('fileName', this.fileRawName) // 文件的名称
formData.append('split', 1) // 是否分片,1是,0否
formData.append('size', this.chunkList[i].size) // 当前切片的大小
console.log(i,this.chunkList.length,this.chunkList[i], this.fileMd5,this.fileRawName,this.chunkList[i].size);
axios.post('上传接口',formData).then((res)=>{
console.log('成功',res); // 处理成功的函数 相当于success
}).catch((error)=>{
console.log('失败',error) // 错误处理 相当于error
})
}
},
vue实现大文件切片,点击上传
最新推荐文章于 2024-04-03 15:18:19 发布