vue实现大文件分片上传
这里使用了element ui的文件上传插件
<div class="inputTitle">人员资料</div>
<div class="uploadBox">
<div class="picture">
<img src="@/assets/images/zip-before.png">
</div>
<el-upload :show-file-list="false" accept=".zip" :limit="1" action class="mirror-upload" :http-request="putinMirror" :auto-upload="false" ref="upload">
<el-button type="primary">上传人员资料</el-button>
</el-upload>
<div class="fileType">仅支持zip压缩包文件</div>
</div>
<div style="width:75%;margin: 20px auto;">
<el-progress :percentage="progress" :indeterminate="true" />
</div>
<div class="dialog-footer" v-if="showbtn">
<el-button type="primary" @click="commitFile">确定</el-button>
<el-button @click="closeInput">取消</el-button>
</div>
定义全局的字段
data () {
return {
showbtn:true,
progress:0,//进度条
}
},
js代码部分
commitFile(){
this.$refs.upload.submit();
},
closeInput(){
this.progress = 0;
this.importDialog = false;
},
async putinMirror(file){
// 每个文件切片大小定为5MB
var sliceSize = 0.5 * 1024 * 1024;
//文件大小限制为最大1个G,可根据需求修改
var filesizes = 1 * 1024 * 1024 * 1024;
let that = this;
const blob = file.file;
const fileSize = blob.size;// 文件大小
const fileName = blob.name;// 文件名
//计算文件切片总数
const totalSlice = Math.ceil(fileSize / sliceSize);
if(fileSize <= filesizes){
that.showbtn = false;
// 循环上传
for (let i = 0; i < totalSlice; i++) {
let start = i * sliceSize;
let chunk = blob.slice(start, Math.min(fileSize, start + sliceSize));
const formData = new FormData();
formData.append("file", chunk);
formData.append("signal", blob.uid);
formData.append("name", fileName);
formData.append("size", fileSize);
formData.append("chunks", totalSlice);
formData.append("chunk", i+1);
let res = await uploadExcleAndZip(2,formData);//一个分片上传完成后再调用接口上传下一片
console.log(res);
if(res.errCode == 0){
this.progress = ((i+1)/totalSlice).toFixed(1) * 100;//控制进度条
setTimeout(function() {
if((i+1) == totalSlice){
that.$message({
message: '上传成功',
type: 'success'
});
that.showbtn = true;
that.closeInput();
that.getTreeData();
}
}, 1000);
}else {
that.$message({
message: '上传失败',
type: 'error'
});
}
}
}else{
that.showbtn = true;
that.$message({
message: '文件大小超出1G',
type: 'error'
});
}
},
参考文章:http://blog.ncmem.com/wordpress/2023/12/08/vue%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0/
欢迎入群一起讨论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2020-12-08 php大文件上传(切片)问题
2020-12-08 php大文件上传(切片)方法
2020-12-08 php大文件上传(切片)思路
2020-12-08 php大文件上传(切片)功能
2020-12-08 php大文件上传(切片)解决方案
2020-12-08 php大文件上传(切片)方案
2020-12-08 php大文件上传(切片)技术