vanUploader.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <div class="upload">
  3. <van-row class="cell">
  4. <van-col span="6">{{text}}:</van-col>
  5. <van-col span="18">
  6. <div class="box">
  7. <van-uploader v-if="text=='图片'" :before-read="beforeRead" v-model="imgUrl" accept="image/png,image/jpeg,image/jpg" :after-read="afterRead" @delete='deleteUploader'>
  8. </van-uploader>
  9. <van-uploader v-else v-model="multiMediaUrl" accept="video/*" :before-read="beforeRead2" :after-read="afterRead" @delete='deleteUploader'>
  10. <template #preview-cover="{ file }">
  11. <div v-if="file.type.indexOf('video') !== -1" class="none-box">
  12. <img :src="require('../assets/video.png')">
  13. </div>
  14. </template>
  15. </van-uploader>
  16. </div>
  17. </van-col>
  18. </van-row>
  19. <!-- <van-row class="cell">
  20. <van-col span="6">视频:</van-col>
  21. <van-col span="18">
  22. <div class="box">
  23. <van-uploader v-model="multiMediaUrl" accept="video/*" :after-read="afterRead" @delete='deleteUploader'>
  24. <template #preview-cover="{ file }">
  25. <div v-if="file.type.indexOf('video') !== -1" class="none-box">
  26. <img :src="require('../assets/video.png')">
  27. </div>
  28. </template>
  29. </van-uploader>
  30. </div>
  31. </van-col>
  32. </van-row> -->
  33. </div>
  34. </template>
  35. <script>
  36. import { uploadImage } from '../api/index.js'
  37. import { compressAccurately } from 'image-conversion'
  38. export default {
  39. props: ['text', 'showimg'],
  40. data() {
  41. return {
  42. multiMediaUrl: [],
  43. imgUrl: [],
  44. fileList: [],
  45. progress: '',
  46. }
  47. },
  48. watch: {
  49. showimg: {
  50. handler(val, old) {
  51. console.log(val, '123')
  52. console.log(old, '78')
  53. },
  54. },
  55. },
  56. methods: {
  57. childrenClear() {
  58. this.imgUrl = []
  59. this.multiMediaUrl = []
  60. },
  61. beforeRead2(file) {
  62. console.log(file.size > 50 * 1024 * 1024)
  63. if (file.size > 50 * 1024 * 1024) {
  64. this.$toast('视频不能超过50MB')
  65. return
  66. }
  67. return true
  68. },
  69. // 返回布尔值
  70. beforeRead(file) {
  71. if (file.length) {
  72. file.forEach((item) => {
  73. if (
  74. item.name.indexOf('.png') == -1 &&
  75. item.name.indexOf('.jpg') == -1 &&
  76. item.name.indexOf('.jpeg') == -1
  77. ) {
  78. this.$toast('请上传 jpg/png 格式图片')
  79. return false
  80. }
  81. })
  82. } else {
  83. if (
  84. file.name.indexOf('.png') == -1 &&
  85. file.name.indexOf('.jpg') == -1 &&
  86. file.name.indexOf('.jpeg') == -1
  87. ) {
  88. this.$toast('请上传 jpg/png 格式图片')
  89. return false
  90. }
  91. }
  92. return true
  93. },
  94. async afterRead(file) {
  95. let formDate = new FormData()
  96. if (file.length) {
  97. file.forEach(async (item) => {
  98. item.status = 'uploading'
  99. item.message = '上传中...'
  100. //添加入参
  101. formDate.append('file', item.file)
  102. this.uploading(formDate, item)
  103. })
  104. } else {
  105. file.status = 'uploading'
  106. file.message = '上传中...'
  107. console.log(file.file.name)
  108. if (
  109. file.file.name.indexOf('.png') != -1 ||
  110. file.file.name.indexOf('.jpg') != -1 ||
  111. file.file.name.indexOf('.jpeg') != -1
  112. ) {
  113. const res = await compressAccurately(file.file, 400)
  114. console.log(res, 'res')
  115. const obj = {}
  116. obj.file = res
  117. //添加入参
  118. formDate.append('file', obj.file)
  119. formDate.append('thumbs', '240x240')
  120. this.uploading(formDate, file)
  121. } else {
  122. // 视频
  123. console.log(file.file.size, 'file.file')
  124. //添加入参
  125. formDate.append('file', file.file)
  126. this.uploading(formDate, file)
  127. }
  128. }
  129. console.log(this.multiMediaUrl, 'this.multiMediaUrl')
  130. },
  131. async uploading(formDate, file) {
  132. console.log(formDate, 'formDate')
  133. var res = await uploadImage(formDate, function (e) {
  134. console.log(e)
  135. var progress = Math.floor((e.loaded / e.total) * 100) + '%'
  136. file.message = '上传中' + progress
  137. })
  138. console.log(res, 'res')
  139. if (res.code == '0000') {
  140. file.status = 'success'
  141. file.message = '成功'
  142. this.$emit('getfileList', res.data)
  143. } else {
  144. file.status = 'failed'
  145. file.message = '上传失败'
  146. }
  147. return res.code
  148. },
  149. deleteUploader(v, index) {
  150. this.$emit('getfileList', this.text, index.index)
  151. },
  152. },
  153. }
  154. </script>
  155. <style lang="scss" scoped>
  156. .cell {
  157. border-bottom: 1px solid #eee;
  158. margin-top: 16px;
  159. font-size: 30px;
  160. .van-col {
  161. line-height: 80px;
  162. min-height: 80px;
  163. }
  164. .van-cell {
  165. padding: 0;
  166. line-height: 80px;
  167. }
  168. }
  169. .van-uploader {
  170. ::v-deep .van-uploader__wrapper {
  171. .van-uploader__upload {
  172. width: 200px;
  173. height: 200px;
  174. }
  175. }
  176. ::v-deep .van-uploader__preview {
  177. .van-uploader__file-icon,
  178. .van-uploader__file-name {
  179. display: none;
  180. }
  181. .van-image {
  182. width: 200px;
  183. height: 200px;
  184. }
  185. width: 200px;
  186. height: 200px;
  187. }
  188. .none-box {
  189. img {
  190. width: 200px;
  191. height: 200px;
  192. }
  193. }
  194. }
  195. </style>