my-upload.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <template>
  2. <u-upload @afterRead="afterRead" :maxCount="maxCount" :accept="accept" multiple>
  3. <slot />
  4. </u-upload>
  5. </template>
  6. <script>
  7. export default {
  8. name: "MyUpload",
  9. props: {
  10. accept: { //接受的文件类型,file只支持H5(只有微信小程序才支持把accept配置为all、media)
  11. type: String,
  12. default: "image"
  13. },
  14. maxCount: {
  15. type: String,
  16. default: "99"
  17. },
  18. parentid: { //上传文件夹ID
  19. type: [String, Number],
  20. default: uni.getStorageSync('siteP').appfolderid
  21. },
  22. uploadCallback: { //上传回调
  23. type: Function
  24. },
  25. },
  26. methods: {
  27. afterRead({ file }) {
  28. const that = this;
  29. file.forEach(v => {
  30. // #ifdef H5
  31. this.getArrayBuffer(v).then(data => that.handleUploadFile(this.requestType(v), data))
  32. // #endif
  33. // #ifndef H5
  34. uni.getFileSystemManager().readFile({
  35. filePath: v.url,
  36. success: data => that.handleUploadFile(this.requestType(v), data.data),
  37. fail: console.error
  38. })
  39. // #endif
  40. });
  41. },
  42. /* 请求类型 */
  43. requestType(file) {
  44. // #ifdef H5
  45. var ext = file.name.substr(file.name.lastIndexOf(".") + 1);
  46. // #endif
  47. // #ifndef H5
  48. var ext = file.type.split("/")[1] || file.url.substr(file.url.lastIndexOf(".") + 1) || file.name.substr(file.name.lastIndexOf(".") + 1);
  49. // #endif
  50. //文件名称
  51. return {
  52. "classname": "system.attachment.huawei.OBS",
  53. "method": "getFileName",
  54. "content": {
  55. "filename": `${Date.now() + file.size}.${ext}`,
  56. "filetype": ext,
  57. "parentid": this.parentid
  58. }
  59. }
  60. },
  61. handleUploadFile(file, data) {
  62. this.$Http.basic(file).then(res => {
  63. if (res.msg == "成功") {
  64. this.uploadFile(res.data, data)
  65. } else {
  66. uni.showToast({
  67. title: `${data.filename}.${data.serialfilename}`,
  68. icon: "none"
  69. })
  70. }
  71. })
  72. },
  73. getArrayBuffer(file) {
  74. return new Promise((resolve, reject) => {
  75. let xhr = new XMLHttpRequest()
  76. xhr.open('GET', file.url, true)
  77. xhr.responseType = 'blob'
  78. xhr.onload = function () {
  79. if (this.status == 200) {
  80. let myBlob = this.response
  81. let files = new window.File([myBlob], file.name, { type: file.url.substr(file.url.lastIndexOf(".") + 1) }) // myBlob.type 自定义文件名
  82. const reader = new FileReader();
  83. reader.readAsArrayBuffer(files);
  84. reader.onload = () => resolve(reader.result);
  85. reader.onerror = (error) => reject(error);
  86. } else {
  87. reject(false)
  88. }
  89. }
  90. xhr.send()
  91. })
  92. },
  93. /* 上传成功反馈 */
  94. uploadFile(res, data) {
  95. var that = this;
  96. uni.request({
  97. url: res.uploadurl,
  98. method: "PUT",
  99. data,
  100. header: {
  101. 'content-type': 'application/octet-stream'
  102. },
  103. success() {
  104. that.$Http.basic({
  105. "classname": "system.attachment.huawei.OBS",
  106. "method": "uploadSuccess",
  107. "content": {
  108. "serialfilename": res.serialfilename
  109. }
  110. }).then(s => {
  111. console.log("文件上传反馈", s)
  112. if (!that.cutoff(s.msg)) that.$emit("uploadCallback", s.data.attachmentids);
  113. }).catch(err => {
  114. console.error(err)
  115. })
  116. },
  117. fail(err) {
  118. console.log(err)
  119. }
  120. })
  121. }
  122. },
  123. }
  124. </script>