经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之文件上传(十)
来源:cnblogs  作者:crudapi  时间:2021/6/28 9:34:05  对本文有异议

基于Vue和Quasar的前端SPA项目实战之文件上传(十)

回顾

通过之前一篇文章 基于Vue和Quasar的前端SPA项目实战之数据导入(九)的介绍,实现了业务数据批量导入功能,本文主要介绍文件上传相关内容。

简介

crudapi支持附件字段,表字段里面保存的是文件url字符串。附件可以通过其它文件管理系统比如阿里云的OSS进行上传,或者使用系统自带的文件管理API进行上传,包括普通文件上传和大文件切片上传两种方式。

UI界面

文件上传
文件上传

大文件上传
大文件上传

API

文件上传API

文件上传API,包括普通文件上传和大文件切片两个功能,具体的通过swagger文档可以查看。通过axios封装api,名称为file

  1. import { axiosInstance } from "boot/axios";
  2. const HEADERS = {
  3. "Content-Type": "multipart/form-data"
  4. };
  5. const file = {
  6. upload: async function(data, progressCallback) {
  7. console.log("file->upload")
  8. return axiosInstance.post(`/api/file` , data,
  9. {
  10. headers: HEADERS,
  11. onUploadProgress: (progressEvent) => {
  12. if (progressCallback) {
  13. progressCallback(progressEvent)
  14. }
  15. }
  16. });
  17. },
  18. bigUpload: async function(data, progressCallback) {
  19. console.log("file->bigUpload")
  20. return axiosInstance.post(`/api/file/big` , data,
  21. {
  22. headers: HEADERS,
  23. onUploadProgress: (progressEvent) => {
  24. if (progressCallback) {
  25. progressCallback(progressEvent)
  26. }
  27. }
  28. });
  29. }
  30. };
  31. export { file };

核心代码

CFile组件

  1. <q-toggle v-model="enableBigFile" label="开启大文件上传模式" />
  2. <div v-show="!enableBigFile" class="q-py-md">
  3. <q-file v-model="normalFile" label="请选择文件(普通上传)">
  4. <template v-slot:prepend>
  5. <q-icon name="attach_file" />
  6. </template>
  7. <template v-slot:after>
  8. <q-btn round dense flat icon="send" @click="onSubmitClick" />
  9. </template>
  10. </q-file>
  11. </div>
  12. <div v-show="enableBigFile" class="q-py-md">
  13. <q-file v-model="bigFile" @input="bigFileAdded" label="请选择文件(大文件上传)">
  14. <template v-slot:prepend>
  15. <q-icon name="attach_file" />
  16. </template>
  17. <template v-slot:after>
  18. <q-btn round dense flat icon="flight_land" @click="onBigSubmitClick" />
  19. </template>
  20. </q-file>
  21. </div>

通过toggle切换上传模式,如果是小文件采用普通的方式即可。

普通上传

  1. async onSubmitClick() {
  2. console.info("CFile->onSubmitClick");
  3. if (!this.normalFile) {
  4. this.$q.notify({
  5. message: '请选择文件!',
  6. type: 'warning'
  7. });
  8. return;
  9. }
  10. this.$q.loading.show({
  11. message: "上传中"
  12. });
  13. try {
  14. let form = new FormData()
  15. form.append('file', this.normalFile);
  16. this.fileInfo = await fileService.upload(form, (e)=> {
  17. console.info(e);
  18. });
  19. this.$q.loading.hide();
  20. this.$emit("input", this.fileInfo);
  21. } catch (error) {
  22. this.$q.loading.hide();
  23. console.error(error);
  24. }
  25. }

大文件切片上传

  1. bigFileAdded(f) {
  2. console.info("CFile->fileAdded");
  3. if (!f) {
  4. console.info("CFile->cancel");
  5. return;
  6. }
  7. this.$q.loading.show({
  8. message: "文件准备中"
  9. });
  10. FileMd5(f, this.chunkSize, (e, md5) => {
  11. this.md5 = md5;
  12. console.info(e);
  13. console.info(md5);
  14. this.$q.loading.hide();
  15. });
  16. },
  17. async onBigSubmitClick() {
  18. console.info("CFile->onBigSubmitClick");
  19. if (!this.bigFile) {
  20. this.$q.notify({
  21. message: '请选择文件!',
  22. type: 'warning'
  23. });
  24. return;
  25. }
  26. this.$q.loading.show({
  27. message: "上传中"
  28. });
  29. try {
  30. let chunks = this.getChunks();
  31. let reqs = [];
  32. for (let i = 0; i < chunks; ++i) {
  33. reqs.push(this.uploadWithBlock(i));
  34. }
  35. await Promise.all(reqs)
  36. .then((datas) => {
  37. console.info(datas);
  38. this.checkFinished(datas);
  39. });
  40. } catch (error) {
  41. this.$q.loading.hide();
  42. console.error(error);
  43. }
  44. }

大文件如果采用普通的上传方式,可能由于网络的原因速度比较慢,而且不稳定,所以采用切片的方式进行多线程上传。具体原理如下:首先计算文件MD5,后台会根据MD5唯一确定是同一个文件,同一个文件的不同block根据大小和偏移量会写在相同文件对应的位置,当最后一个block上传成功后,表示上传结束。分片大小默认为20MB,可以配置为需要的值,前端通过Promise.all的ajax调用方式可以实现多线程同时上传。

文件表为例

文件表
文件表的“链接”字段设置类型为“附件ATTACHMENT”,添加业务数据页面会自动采用CFile组件。

大文件上传demo
选择大文件之后,点击上传图标,通过chrome网络请求发现,多线程分片上传模式已经启动,上传结束之后可以查看下载。

小结

本文主要介绍了文件上传功能,包括普通上传模式和大文件切片上传模式,大文件切片上传模式通过优化后很容易支持断点续传和秒传,后续会根据需求优化文件上传功能。

demo演示

官网地址:https://crudapi.cn
测试地址:https://demo.crudapi.cn/crudapi/login

附源码地址

GitHub地址

https://github.com/crudapi/crudapi-admin-web

Gitee地址

https://gitee.com/crudapi/crudapi-admin-web

由于网络原因,GitHub可能速度慢,改成访问Gitee即可,代码同步更新。

原文链接:http://www.cnblogs.com/crudapi/p/14917347.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号