file-upload.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <view>
  3. <lsj-upload ref="lsjUpload" :height="'100%'" :option="option" @uploadEnd="onUploadEnd" @change="onChange"
  4. :size="maxSize" :instantly="true">
  5. <slot></slot>
  6. </lsj-upload>
  7. </view>
  8. </template>
  9. <script>
  10. import UNI_APP from '@/.env.js';
  11. export default {
  12. name: "file-upload",
  13. data() {
  14. return {
  15. fileMap: new Map(),
  16. option: {
  17. url: UNI_APP.BASE_URL + '/file/upload',
  18. name: 'file',
  19. header: {
  20. accessToken: uni.getStorageSync('loginInfo').accessToken
  21. }
  22. }
  23. }
  24. },
  25. props: {
  26. maxSize: {
  27. type: Number,
  28. default: 10
  29. },
  30. onBefore: {
  31. type: Function,
  32. default: null
  33. },
  34. onSuccess: {
  35. type: Function,
  36. default: null
  37. },
  38. onError: {
  39. type: Function,
  40. default: null
  41. }
  42. },
  43. methods: {
  44. show() {
  45. this.$refs.lsjUpload.show();
  46. },
  47. hide() {
  48. this.$refs.lsjUpload.hide();
  49. },
  50. onUploadEnd(item) {
  51. let file = this.fileMap.get(item.path);
  52. if (item.type == 'fail') {
  53. this.onError(file)
  54. return;
  55. }
  56. let res = JSON.parse(item.responseText);
  57. if (res.code == 200) {
  58. // 上传成功
  59. this.onOk(file, res);
  60. } else if (res.code == 401) {
  61. // token已过期,重新获取token
  62. this.refreshToken().then((res) => {
  63. let newToken = res.data.accessToken;
  64. this.option.header.accessToken = newToken;
  65. this.$refs.lsjUpload.setData(this.option);
  66. // 重新上传
  67. this.$refs.lsjUpload.upload(file.name);
  68. }).catch(() => {
  69. this.onError(file, res);
  70. })
  71. } else {
  72. // 上传失败
  73. this.onError(file, res);
  74. }
  75. },
  76. onChange(files) {
  77. if (!files.size) {
  78. return;
  79. }
  80. files.forEach((file, name) => {
  81. if (!this.fileMap.has(file.path)) {
  82. this.onBefore && this.onBefore(file)
  83. this.fileMap.set(file.path, file);
  84. }
  85. })
  86. },
  87. onOk(file, res) {
  88. this.fileMap.delete(file.path);
  89. this.$refs.lsjUpload.clear(file.name);
  90. this.onSuccess && this.onSuccess(file, res);
  91. },
  92. onFailed(file, res) {
  93. this.fileMap.delete(file.path);
  94. this.$refs.lsjUpload.clear(file.name);
  95. this.onError && this.onError(file, res);
  96. },
  97. refreshToken() {
  98. return new Promise((resolve, reject) => {
  99. let loginInfo = uni.getStorageSync('loginInfo')
  100. uni.request({
  101. method: 'PUT',
  102. url: UNI_APP.BASE_URL + '/refreshToken',
  103. header: {
  104. refreshToken: loginInfo.refreshToken
  105. },
  106. success: (res) => {
  107. resolve(res.data);
  108. },
  109. fail: (res) => {
  110. reject(res);
  111. }
  112. })
  113. })
  114. }
  115. }
  116. }
  117. </script>
  118. <style></style>