upload.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. node['isImage'] = this.image(node.type.toLowerCase());
  37. return node;
  38. });
  39. },
  40. methods: {
  41. image(value) {
  42. return 'jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg'.indexOf(value) > -1;
  43. },
  44. // 删除图片
  45. deletePic(event) {
  46. uni.showModal({
  47. title: '有极提示',
  48. content: '是否删除该附件',
  49. success: res => {
  50. if (res.confirm) {
  51. this.fileList.splice(event.index, 1)
  52. }
  53. }
  54. });
  55. },
  56. // 新增图片
  57. async afterRead(event) {
  58. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  59. let lists = [].concat(event.file)
  60. let fileListLen = this.fileList.length;
  61. lists.map((item) => {
  62. this.fileList.push({
  63. ...item,
  64. status: 'uploading',
  65. message: '上传中'
  66. })
  67. })
  68. for (let i = 0; i < lists.length; i++) {
  69. const result = await this.uploadFilePromise(lists[i].url)
  70. let item = this.fileList[fileListLen]
  71. this.fileList.splice(fileListLen, 1, Object.assign(item, {
  72. status: 'success',
  73. message: '',
  74. url: result.node.url,
  75. id: result.id,
  76. name: result.name
  77. }))
  78. fileListLen++
  79. }
  80. },
  81. uploadFilePromise(url) {
  82. return new Promise((resolve, reject) => {
  83. let a = uni.uploadFile({
  84. url: config.baseUrl + '/file/filenode/-1', // 仅为示例,非真实的接口地址
  85. filePath: url,
  86. name: 'uploadFile',
  87. success: (res) => {
  88. setTimeout(() => {
  89. resolve(JSON.parse(res.data).data)
  90. }, 1000)
  91. }
  92. });
  93. })
  94. },
  95. getFile() {
  96. return this.fileList.map(res => {
  97. return {
  98. id: res.id,
  99. name: res.name,
  100. url: res.url,
  101. type: res.type
  102. }
  103. })
  104. }
  105. }
  106. }
  107. </script>
  108. <style>
  109. </style>