当前位置:   article > 正文

前端使用vue-simple-uploader进行分片上传_前端uploader 分片接口没有调用

前端uploader 分片接口没有调用

目录

 一、安装vue-simple-uploader

二、在vue中使用 


 一、安装vue-simple-uploader

npm install vue-simple-uploader --save

main.js初始化vue-simple-uploader

  1. import uploader from 'vue-simple-uploader'
  2. Vue.use(uploader)

common/config文件

  1. export const ACCEPT_CONFIG = {
  2. image: ['.png', '.jpg', '.jpeg', '.gif', '.bmp'],
  3. video: ['.mp4', '.rmvb', '.mkv', '.wmv', '.flv'],
  4. document: ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf', '.txt', '.tif', '.tiff', '.rar', '.zip'],
  5. getAll() {
  6. return [...this.image, ...this.video, ...this.document]
  7. }
  8. }

二、在vue中使用 

  1. <template>
  2. <!-- 上传器 -->
  3. <!-- 1、 options:uploader属性配置
  4. fileStatusText:上传结果信息提示
  5. @upload-start="onUploadStart" // 上传开始监听
  6. @file-added="onFileAdded" // 文件上传到服务器前操作,可用校验等
  7. @file-progress="onFileProgress" // onFileProgress上传进度回调
  8. @file-success="onFileSuccess" // 所有分片上传完毕执行
  9. @file-error="onFileError" // 上传错误监听 -->
  10. <uploader
  11. ref="uploader"
  12. :options="options"
  13. :auto-start="false"
  14. :file-status-text="fileStatusText"
  15. class="uploader-ui"
  16. @file-added="onFileAdded"
  17. @file-success="onFileSuccess"
  18. @file-progress="onFileProgress"
  19. @file-error="onFileError"
  20. >
  21. <uploader-unsupport />
  22. <uploader-drop>
  23. <div>
  24. <uploader-btn id="global-uploader-btn" ref="uploadBtn" :attrs="attrs">选择文件<i class="el-icon-upload el-icon--right" /></uploader-btn>
  25. </div>
  26. </uploader-drop>
  27. <uploader-list />
  28. </uploader>
  29. </template>
  30. <script>
  31. import { ACCEPT_CONFIG } from '@/common/config'
  32. import SparkMD5 from 'spark-md5'
  33. import * as API from '@/api/index'
  34. // import { mergeFile } from '@/api/modules/uploadFile'
  35. export default {
  36. data() {
  37. return {
  38. options: {
  39. // 目标上传 URL,默认POST 文件块上传 分片检查接口
  40. target: '/upgrade/system/fileTransfer/chunk',
  41. // 分块大小(单位:字节)
  42. chunkSize: '2048000',
  43. // 上传文件时文件内容的参数名,对应chunk里的Multipart对象名,默认对象名为file
  44. fileParameterName: 'upfile',
  45. // 失败后最多自动重试上传次数
  46. maxChunkRetries: 3,
  47. // 是否开启服务器分片校验,对应GET类型同名的target URL
  48. testChunks: true,
  49. /*
  50. 服务器分片校验函数,判断秒传及断点续传,传入的参数是Uploader.Chunk实例以及请求响应信息
  51. reponse码是successStatuses码时,才会进入该方法
  52. reponse码如果返回的是permanentErrors 中的状态码,不会进入该方法,直接进入onFileError函数 ,并显示上传失败
  53. reponse码是其他状态码,不会进入该方法,正常走标准上传
  54. checkChunkUploadedByResponse函数直接return true的话,不再调用上传接口
  55. */
  56. checkChunkUploadedByResponse: function(chunk, response_msg) {
  57. const objMessage = JSON.parse(response_msg)
  58. if (objMessage.data.skipUpload) {
  59. return true
  60. }
  61. return (objMessage.uploadedChunks || []).indexOf(chunk.offset + 1) >= 0
  62. }
  63. },
  64. // 接受的文件类型
  65. attrs: {
  66. accept: ACCEPT_CONFIG.getAll()
  67. },
  68. fileStatusText: {
  69. success: '上传成功',
  70. error: '上传失败',
  71. uploading: '上传中',
  72. paused: '暂停',
  73. waiting: '等待上传'
  74. },
  75. relativePath: ''
  76. }
  77. },
  78. methods: {
  79. // 文件上传到服务器前操作,可用校验等
  80. onFileAdded(file) {
  81. this.relativePath = file.relativePath
  82. this.computeMD5(file)
  83. },
  84. // onFileProgress上传进度回调
  85. onFileProgress(rootFile, file, chunk) {
  86. console.log(`上传中 ${file.name},chunk:${chunk.startByte / 1024 / 1024} ~ ${chunk.endByte / 1024 / 1024}`)
  87. },
  88. /*
  89. 第一个参数 rootFile 就是成功上传的文件所属的根 Uploader.File 对象,它应该包含或者等于成功上传文件;
  90. 第二个参数 file 就是当前成功的 Uploader.File 对象本身;
  91. 第三个参数就是 message 就是服务端响应内容,永远都是字符串;
  92. 第四个参数 chunk 就是 Uploader.Chunk 实例,它就是该文件的最后一个块实例,如果你想得到请求响应码的话,chunk.xhr.status就是
  93. */
  94. // 成功之后调取合并接口
  95. onFileSuccess(rootFile, file, response, chunk) {
  96. const data = {
  97. fileMd5: file.uniqueIdentifier,
  98. fileSize: file.size,
  99. fileSource: 0,
  100. fileName: file.relativePath
  101. }
  102. API.mergeFile(data).then(res => {
  103. console.log(this.$refs.uploader)
  104. this.$emit('handlerCloses', file, this.$refs.uploader)
  105. })
  106. // refProjectId为预留字段,可关联附件所属目标,例如所属档案,所属工程等
  107. // file.refProjectId = '123456789'
  108. // mergeFile(file).then(responseData => {
  109. // if (responseData.data.code === 415) {
  110. // console.log('合并操作未成功,结果码:' + responseData.data.code)
  111. // }
  112. // }).catch(function(error) {
  113. // console.log('合并后捕获的未知异常:' + error)
  114. // })
  115. },
  116. // 上传错误监听
  117. onFileError(rootFile, file, response, chunk) {
  118. console.log('上传完成后异常信息:' + response)
  119. },
  120. // 计算md5,实现断点续传及秒传 @param file
  121. computeMD5(file) {
  122. file.pause()
  123. // 单个文件的大小限制2G
  124. const fileSizeLimit = 2 * 1024 * 1024 * 1024
  125. console.log('文件大小:' + file.size)
  126. console.log('限制大小:' + fileSizeLimit)
  127. if (file.size > fileSizeLimit) {
  128. this.$message({
  129. showClose: true,
  130. message: '文件大小不能超过2G'
  131. })
  132. file.cancel()
  133. }
  134. const fileReader = new FileReader()
  135. const time = new Date().getTime()
  136. const blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice
  137. let currentChunk = 0
  138. const chunkSize = 10 * 1024 * 1000
  139. const chunks = Math.ceil(file.size / chunkSize)
  140. const spark = new SparkMD5.ArrayBuffer()
  141. // 由于计算整个文件的Md5太慢,因此采用只计算第1块文件的md5的方式
  142. const chunkNumberMD5 = 1
  143. loadNext()
  144. fileReader.onload = e => {
  145. spark.append(e.target.result)
  146. if (currentChunk < chunkNumberMD5) {
  147. loadNext()
  148. } else {
  149. const md5 = spark.end()
  150. file.uniqueIdentifier = md5
  151. file.resume()
  152. // const api = true
  153. // const params = {
  154. // fileMd5: md5,
  155. // fileName: this.relativePath
  156. // }
  157. // // 分片检查 是否有重复的md5
  158. // API.transChunk(params).then(res => {
  159. // console.log(res.data.skipUpload)
  160. // // 无重复文件
  161. // if (res.data.skipUpload === false) {
  162. // file.uniqueIdentifier = md5
  163. // file.resume()
  164. // } else if (res.data.skipUpload === true) {
  165. // console.log(res.data.skipUpload, 'true')
  166. // this.$message.error('已上传过此文件!')
  167. // // 有重复的文件上传 则退出
  168. // file.cancel()
  169. // }
  170. // })
  171. console.log(`MD5计算完毕:${file.name} \nMD5:${md5} \n分片:${chunks} 大小:${file.size} 用时:${new Date().getTime() - time} ms`)
  172. }
  173. }
  174. fileReader.onerror = function() {
  175. this.error(`文件${file.name}读取出错,请检查该文件`)
  176. file.cancel()
  177. }
  178. function loadNext() {
  179. const start = currentChunk * chunkSize
  180. const end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize
  181. fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end))
  182. currentChunk++
  183. console.log('计算第' + currentChunk + '块')
  184. }
  185. },
  186. close() {
  187. this.uploader.cancel()
  188. },
  189. error(msg) {
  190. this.$notify({
  191. title: '错误',
  192. message: msg,
  193. type: 'error',
  194. duration: 2000
  195. })
  196. }
  197. }
  198. }
  199. </script>
  200. <style>
  201. .uploader-ui {
  202. padding: 15px;
  203. margin: 40px auto 0;
  204. font-size: 12px;
  205. font-family: Microsoft YaHei;
  206. box-shadow: 0 0 10px rgba(0, 0, 0, .4);
  207. }
  208. .uploader-ui .uploader-btn {
  209. margin-right: 4px;
  210. font-size: 12px;
  211. border-radius: 3px;
  212. color: #FFF;
  213. background-color: #409EFF;
  214. border-color: #409EFF;
  215. display: inline-block;
  216. line-height: 1;
  217. white-space: nowrap;
  218. }
  219. .uploader-ui .uploader-list {
  220. max-height: 440px;
  221. overflow: auto;
  222. overflow-x: hidden;
  223. overflow-y: auto;
  224. }
  225. </style>

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

闽ICP备14008679号