当前位置: 首页 > Web前端 > HTML5

《免费开源》基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战文件上传(十)

时间:2023-04-05 01:10:27 HTML5

基于Vue和Quasar的前端SPA项目实战文件上传(十)回顾通过上一篇基于Vue和Quasar的前端SPA项目实战数据导入介绍(九)实现业务数据的批量导入功能。本文主要介绍文件上传的相关内容。介绍Crudapi支持附件字段,表字段存储文件url字符串。附件可以通过阿里云OSS等其他文件管理系统上传,也可以使用系统自带的文件管理API上传,包括普通文件上传和大文件切片上传。UI界面文件上传大文件上传API文件上传API,包括普通文件上传和大文件切片两个功能,可以通过swagger文档查看。通过axios封装api,名称为fileimport{axiosInstance}from"boot/axios";constHEADERS={"Content-Type":"multipart/form-data"};constfile={upload:asyncfunction(data,progressCallback){console.log("file->upload")返回axiosInstance.post(`/api/file`,data,{headers:HEADERS,onUploadProgress:(progressEvent)=>{if(progressCallback){progressCallback(progressEvent)}}});},bigUpload:asyncfunction(data,progressCallback){console.log("file->bigUpload")returnaxiosInstance.post(`/api/file/big`,data,{headers:HEADERS,onUploadProgress:(progressEvent)=>{if(progressCallback){progressCallback(progressEvent)}}});}};export{file};核心代码CFile组件

切换上传模式toggle,如果是小文件,可以正常完成通用上传asynconSubmitClick(){console.info("CFile->onSubmitClick");if(!this.normalFile){this.$q.notify({message:'请选择文件!',type:'warning'});返回;}this.$q.loading.show({message:"上传中"});try{letform=newFormData()form.append('file',this.normalFile);this.fileInfo=awaitfileService.upload(form,(e)=>{console.info(e);});这个.$q.loading.hide();this.$emit("输入",this.fileInfo);}catch(错误){this.$q.loading.hide();控制台错误(错误);}}大文件切片上传bigFileAdded(f){console.info("CFile->fileAdded");if(!f){console.info("CFile->cancel");返回;}this.$q.loading.show({message:"文件准备中"});FileMd5(f,this.chunkSize,(e,md5)=>{this.md5=md5;console.info(e);console.info(md5);this.$q.loading.hide();});},asynconBigSubmitClick(){console.info("CFile->onBigSubmitClick");如果(!this.bigFile){this.$q.notify({message:'请选择一个文件!',输入:'警告'});返回;}this.$q.loading.show({message:"正在上传"});尝试{让块=this.getChunks();让要求=[];for(leti=0;i{console.info(datas);this.checkFinished(datas);});}catch(错误){this.$q.loading.hide();控制台错误(错误);}}大文件如果使用普通上传方式,可能是由于网络原因,速度比较慢且不稳定,所以使用分片进行多线程上传的具体原理如下:首先计算MD5文件的block,后台会根据MD5唯一确定同一个文件,同一个文件的不同block根据size和offset会写入到同一个文件的对应位置。当最后一个块上传成功时,意味着上传结束。分片大小默认为20MB,可以配置成需要的值。前端可以通过Promise.all的ajax调用方式实现多线程同时上传。以文件表为例,设置文件表“链接”字段类型为“附件ATTACHMENT”,添加业务数据的页面会自动使用CFile组件。选择大文件后,点击上传图标,通过chrome网络请求发现已经开启了多线程分片上传模式,上传完成后可以查看下载。总结本文主要介绍文件上传功能,包括普通上传模式和大文件切片上传模式。大文件切片上传方式优化后,轻松支持断点续传和二次上传。文件上传功能将根据需要进行优化。Demo演示官网地址:https://crudapi.cn测试地址:https://demo.crudapi.cn/crudapi/login附源码地址GitHub地址https://github.com/crudapi/crudapi-admin-webGitee地址https://gitee.com/crudapi/crudapi-admin-web由于网络原因,GitHub可能会比较慢,改访问Gitee即可,代码会同步更新。