当前位置:   article > 正文

vue-simple-uploader使用实践_vue-simple-uploader如何写文件名校验

vue-simple-uploader如何写文件名校验

1、前言

目前的element-ui在上传大文件时会出现上传失败的问题,项目希望实现大文件断点续传,秒传等功能。之前在TP项目下使用webuploader上传插件,文件服务器用PHP编写的。由于久不维护,决定使用vue-simple-uploader实现,文件服务器使用golang编写。

2、安装

npm install vue-simple-uploader --save

main.js引用:

md5工具安装:

npm install spark-md5 --save

在当前目录引用:

3、使用

  1. <div
  2. class="upload-box"
  3. v-if="checkBtnMp4()"
  4. >
  5. <div>
  6. <span class="title">上传视频</span>至多1个,不大于600M,支持格式:MP4
  7. </div>
  8. <uploader
  9. ref="upload"
  10. class="uploader-example"
  11. :options="options"
  12. :autoStart="true"
  13. :file-status-text="statusText"
  14. @file-success="success_video"
  15. @file-added="filesAdded"
  16. @file-progress="fileProgress"
  17. @file-error="onFileError"
  18. @file-removed="videoRemove"
  19. >
  20. <uploader-unsupport></uploader-unsupport>
  21. <uploader-drop>
  22. <uploader-btn
  23. :single="true"
  24. :attrs="attrs2"
  25. >点击上传</uploader-btn>
  26. </uploader-drop>
  27. <uploader-list v-show="panelShow"></uploader-list>
  28. </uploader>
  29. <ul
  30. class="el-upload-list el-upload-list--text success-video"
  31. v-if="show_filename && fileListMp4"
  32. >
  33. <li
  34. tabindex="0"
  35. class="el-upload-list__item is-success"
  36. v-for="(item, i) in fileListMp4"
  37. :key="i"
  38. >
  39. <a class="el-upload-list__item-name">
  40. <i class="el-icon-video-play"></i>
  41. {{item.filename}}
  42. </a>
  43. <label class="el-upload-list__item-status-label">
  44. <i class="el-icon-upload-success el-icon-circle-check"></i>
  45. </label>
  46. <i
  47. class="el-icon-close"
  48. @click="delMp4()"
  49. ></i>
  50. </li>
  51. </ul>
  52. </div>
  1. export default {
  2. name: "XXX",
  3. data() {
  4. return {
  5. isUploadOk: true, // 是否还有未上传完成的文件
  6. // 视频
  7. FileLimit: {
  8. FileMaxSize: 600, // 允许上传的大小 单位(G)
  9. FileFormat: ["mp4"], // 允许上传的格式
  10. FileUnit: "M" // 单位
  11. },
  12. panelShow: true, // 展示上传panel
  13. show_filename: true, //是否显示文件列表
  14. fileListMp4: [], // 视频格式数据
  15. uploadUrl: "", // 文件上传地址
  16. uploadData: "", // 文件上传参数
  17. options: {
  18. target: url.uploadPath, // 上传地址
  19. testChunks: false,
  20. singleFile: true, // 启用单个文件上传。上传一个文件后,第二个文件将超过现有文件,第一个文件将被取消。
  21. chunkSize: "1048576" * 1, //分块大小 单位(M)
  22. //下面参数文件服务器验证用
  23. query: {
  24. //传参
  25. UserId: localStorage.getItem("ms_userid"),
  26. SessionKey: localStorage.getItem("ms_token"),
  27. OS: 4,
  28. PluginType: 1
  29. }
  30. },
  31. //上传状态
  32. statusText: {
  33. success: "上传成功!",
  34. error: "出错了!",
  35. uploading: "上传中...",
  36. paused: "等待中...",
  37. waiting: "等待中..."
  38. },
  39. attrs2: {
  40. accept: ".mp4" //允许上传的格式
  41. }
  42. };
  43. }

4、上传流程

filesAdded:添加一个文件时的钩子。

       progress:上传中的钩子。

       onFileError:上传错误触发。

      videoRemove:视频移除。

      success_video:成功上传触发方法。

      

  1. // 添加一个文件时触发
  2. async filesAdded(file) {
  3. var FileLimit = this.FileLimit;
  4. const isFormat = this.checkExtensions(file.name, FileLimit.FileFormat); // 文件格式判断
  5. if (!isFormat) {
  6. file.ignored = true; // 过滤文件
  7. file.cancel(); // 停止上传
  8. return false;
  9. }
  10. // 文件大小判断
  11. const isSize = this.checkSize(file.size);
  12. if (!isSize) {
  13. file.ignored = true; // 过滤文件
  14. file.cancel(); // 停止上传
  15. return false;
  16. } else {
  17. this.panelShow = true; // 展示上传panel
  18. this.show_filename = false; // 不显示文件名
  19. this.computeMD5(file); // md5验证
  20. }
  21. },
  22. // 检查文件大小
  23. checkSize(fileSize) {
  24. var FileLimit = this.FileLimit;
  25. var isSize = fileSize / 1024 / 1024 < FileLimit.FileMaxSize; // 单位(M)
  26. if (!isSize) {
  27. this.$message.warning(
  28. " 文件大小不能大于" + FileLimit.FileMaxSize + FileLimit.FileUnit + "!"
  29. );
  30. return false;
  31. }
  32. return true;
  33. },
  34. // extensions 允许上传的格式
  35. checkExtensions(fileName, extensions) {
  36. var format = fileName
  37. .split(".")
  38. .pop()
  39. .toLowerCase(); // 用户上传的文件格式
  40. // 把允许上传文件格式的数组转为字符串
  41. var s = extensions.join(",");
  42. var exp = new RegExp(format);
  43. if (!exp.test(extensions)) {
  44. this.$message.warning("请上传 " + s + " 的格式!");
  45. return false;
  46. }
  47. return true;
  48. },
  49. // 文件上传中触发
  50. fileProgress(rootFile, file, chunk) {
  51. // 判断上传是否在上传
  52. if (file.isUploading()) {
  53. this.isUploadOk = false; // 禁止上传
  54. } else {
  55. this.isUploadOk = true; // 允许上传
  56. }
  57. },
  58. // 上传错误触发
  59. onFileError(rootFile, file, response, chunk) {
  60. this.$message({
  61. message: "上传失败,请重新上传!",
  62. type: "error"
  63. });
  64. },
  65. // 校验MD5
  66. computeMD5(file) {
  67. let fileReader = new FileReader();
  68. let time = new Date().getTime();
  69. let blobSlice =
  70. File.prototype.slice ||
  71. File.prototype.mozSlice ||
  72. File.prototype.webkitSlice;
  73. let currentChunk = 0;
  74. const chunkSize = 10 * 1024 * 1000;
  75. let chunks = Math.ceil(file.size / chunkSize);
  76. let spark = new SparkMD5.ArrayBuffer();
  77. file.pause();
  78. loadNext();
  79. fileReader.onload = e => {
  80. spark.append(e.target.result);
  81. if (currentChunk < chunks) {
  82. currentChunk++;
  83. loadNext();
  84. this.$nextTick(() => {});
  85. } else {
  86. let md5 = spark.end();
  87. this.computeMD5Success(md5, file);
  88. }
  89. };
  90. fileReader.onerror = function() {
  91. this.error(`文件${file.name}读取出错,请检查该文件`);
  92. file.cancel();
  93. };
  94. function loadNext() {
  95. let start = currentChunk * chunkSize;
  96. let end =
  97. start + chunkSize >= file.size ? file.size : start + chunkSize;
  98. fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end));
  99. }
  100. },
  101. // 验证成功
  102. computeMD5Success(md5, file) {
  103. file.uniqueIdentifier = api.randomString(32); //把md5值作为文件的识别码
  104. file.resume(); //开始上传
  105. },
  106. // 视频移除
  107. videoRemove(file, fileList) {
  108. this.fileListMp4 = [];
  109. },
  110. // 成功上传触发方法
  111. success_video: function(rootFile, file, response, chunk) {
  112. var response = JSON.parse(response);
  113. if (response.Result) {
  114. const fileLists = [];
  115. fileLists.push(response.Data);
  116. this.fileList = fileLists;
  117. } else {
  118. this.$message.error(response.Errstr);
  119. return false;
  120. }
  121. },

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/995832
推荐阅读
相关标签
  

闽ICP备14008679号