upload.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <view class="upload-index">
  3. <uv-upload :accept="accept" :fileList="fileList" name="1" multiple
  4. :maxCount="type === 'insert' ? 5 : list.length" :deletable="type === 'insert'" @afterRead="afterRead"
  5. @delete="deletePic">
  6. </uv-upload>
  7. </view>
  8. </template>
  9. <script>
  10. import config from "@/config";
  11. export default {
  12. name: "preview",
  13. props: {
  14. list: {
  15. type: Array,
  16. default: () => {
  17. return []
  18. }
  19. },
  20. type: {
  21. type: String,
  22. default: 'preview'
  23. },
  24. accept: {
  25. type: String,
  26. default: 'image'
  27. }
  28. },
  29. data() {
  30. return {
  31. fileList: []
  32. };
  33. },
  34. created() {
  35. this.fileList = this.list.map(node => {
  36. if (node.type) {
  37. node['isImage'] = this.image(node.type.toLowerCase());
  38. } else {
  39. let name = node.name.split('.');
  40. node['isImage'] = this.image(name[name.length - 1].toLowerCase());
  41. }
  42. return node;
  43. });
  44. },
  45. methods: {
  46. image(value) {
  47. return 'jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg'.indexOf(value) > -1;
  48. },
  49. // 删除图片
  50. deletePic(event) {
  51. uni.showModal({
  52. title: '有极提示',
  53. content: '是否删除该附件',
  54. success: res => {
  55. if (res.confirm) {
  56. this.fileList.splice(event.index, 1)
  57. }
  58. }
  59. });
  60. },
  61. // 新增图片
  62. async afterRead(event) {
  63. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  64. let lists = [].concat(event.file)
  65. let fileListLen = this.fileList.length;
  66. lists.map((item) => {
  67. this.fileList.push({
  68. ...item,
  69. status: 'uploading',
  70. message: '上传中'
  71. })
  72. })
  73. for (let i = 0; i < lists.length; i++) {
  74. const result = await this.uploadFilePromise(lists[i].url)
  75. let item = this.fileList[fileListLen]
  76. this.fileList.splice(fileListLen, 1, Object.assign(item, {
  77. status: 'success',
  78. message: '',
  79. url: result.node.url,
  80. id: result.id,
  81. name: result.name
  82. }))
  83. fileListLen++
  84. }
  85. },
  86. uploadFilePromise(url) {
  87. return new Promise((resolve, reject) => {
  88. let a = uni.uploadFile({
  89. url: config.baseUrl + '/file/filenode/-1', // 仅为示例,非真实的接口地址
  90. filePath: url,
  91. name: 'uploadFile',
  92. success: (res) => {
  93. setTimeout(() => {
  94. resolve(JSON.parse(res.data).data)
  95. }, 1000)
  96. }
  97. });
  98. })
  99. },
  100. getFile() {
  101. return this.fileList.map(res => {
  102. return {
  103. id: res.id,
  104. name: res.name,
  105. url: res.url,
  106. type: res.type
  107. }
  108. })
  109. }
  110. }
  111. }
  112. </script>
  113. <style>
  114. </style>