file-upload.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. onUploadEnd(item) {
  45. let file = this.fileMap.get(item.path);
  46. if (item.type == 'fail') {
  47. this.onError(file)
  48. return;
  49. }
  50. let res = JSON.parse(item.responseText);
  51. if (res.code == 200) {
  52. // 上传成功
  53. this.onOk(file, res);
  54. } else if (res.code == 401) {
  55. // token已过期,重新获取token
  56. this.refreshToken().then((res) => {
  57. let newToken = res.data.accessToken;
  58. this.option.header.accessToken = newToken;
  59. this.$refs.lsjUpload.setData(this.option);
  60. // 重新上传
  61. this.$refs.lsjUpload.upload(file.name);
  62. }).catch(() => {
  63. this.onError(file, res);
  64. })
  65. } else {
  66. // 上传失败
  67. this.onError(file, res);
  68. }
  69. },
  70. onChange(files) {
  71. if (!files.size) {
  72. return;
  73. }
  74. files.forEach((file, name) => {
  75. if(!this.fileMap.has(file.path)){
  76. this.onBefore && this.onBefore(file)
  77. this.fileMap.set(file.path, file);
  78. console.log(file)
  79. }
  80. })
  81. },
  82. onOk(file, res) {
  83. this.fileMap.delete(file.path);
  84. this.$refs.lsjUpload.clear(file.name);
  85. this.onSuccess && this.onSuccess(file, res);
  86. },
  87. onFailed(file, res) {
  88. this.fileMap.delete(file.path);
  89. this.$refs.lsjUpload.clear(file.name);
  90. this.onError && this.onError(file, res);
  91. },
  92. refreshToken() {
  93. return new Promise((resolve, reject) => {
  94. let loginInfo = uni.getStorageSync('loginInfo')
  95. uni.request({
  96. method: 'PUT',
  97. url: UNI_APP.BASE_URL + '/refreshToken',
  98. header: {
  99. refreshToken: loginInfo.refreshToken
  100. },
  101. success: (res) => {
  102. resolve(res.data);
  103. },
  104. fail: (res) => {
  105. reject(res);
  106. }
  107. })
  108. })
  109. }
  110. }
  111. }
  112. </script>
  113. <style>
  114. </style>