index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <!-- <div>
  3. <van-uploader
  4. accept=""
  5. ref="uploader"
  6. v-bind="$attrs"
  7. v-model="fileList"
  8. :max-count="maxCount"
  9. :multiple="multiple"
  10. @click-upload="useCamera(2)"
  11. @delete="deleteHandler"
  12. :max-size="maxSize * 1024 * 1024"
  13. />
  14. &lt;!&ndash; :after-read="afterRead" &ndash;&gt; &lt;!&ndash; :before-read="beforeRead" &ndash;&gt;
  15. </div> -->
  16. <div>
  17. <div style="float: left">
  18. <van-uploader
  19. ref="uploader"
  20. v-bind="$attrs"
  21. v-model="fileList"
  22. :max-count="maxCount"
  23. @delete="deleteHandler"
  24. :show-upload="false"
  25. :max-size="maxSize * 1024 * 1024"
  26. />
  27. <!-- :before-read="beforeRead"
  28. :after-read="afterRead" -->
  29. </div>
  30. <div class="van-uploader__upload" @click="selectCameraHandler()">
  31. <i class="van-icon van-icon-photograph van-uploader__upload-icon">
  32. </i>
  33. </div>
  34. <van-popup
  35. v-model="selectCamera"
  36. position="bottom"
  37. :style="{ height: '20%' }"
  38. >
  39. <van-cell-group>
  40. <van-cell icon="photograph" title="拍照" @click="useCamera(1)" />
  41. <van-cell icon="photo" title="从相册选择" @click="useCamera(2)" />
  42. <van-cell icon="clear" title="取消" @click="selectCamera = false" />
  43. </van-cell-group>
  44. </van-popup>
  45. </div>
  46. </template>
  47. <script>
  48. import { imgUrl } from '@/utils'
  49. import { uploadBase64 } from '@/api/public'
  50. import ImageCompressor from 'js-image-compressor'
  51. import config from '@/config/index'
  52. export default {
  53. props: {
  54. value: {
  55. type: Array
  56. },
  57. multiple: {
  58. type: Boolean,
  59. default: false
  60. },
  61. //最大上传数量
  62. maxCount: {
  63. type: Number,
  64. default: 6
  65. },
  66. //文件大小,单位MB
  67. maxSize: {
  68. type: Number,
  69. default: 5
  70. }
  71. },
  72. data() {
  73. return {
  74. fileList: [],
  75. //上传之后的图片列表,双向绑定之后覆盖fileList
  76. imageList: [],
  77. selectCamera:false
  78. }
  79. },
  80. mounted() {
  81. window.openCameraCallBack = this.openCameraCallBack
  82. },
  83. watch: {
  84. value: {
  85. handler(val) {
  86. this.imageList = this.fileList = val.map(v => {
  87. let imgUrl = process.env.NODE_ENV === 'development' ? '/dev' + v.path : window.origin + v.path
  88. return {
  89. name: v.name,
  90. url: imgUrl,
  91. path: v.path
  92. }
  93. })
  94. },
  95. deep: true,
  96. immediate: true
  97. }
  98. },
  99. methods: {
  100. selectCameraHandler() {
  101. this.selectCamera = true;
  102. },
  103. useCamera(actionType) {
  104. this.selectCamera = false;
  105. window.openCameraCallBack = null
  106. window.openCameraCallBack = this.openCameraCallBack
  107. let parms = {}
  108. if (actionType) {
  109. parms.actionType = actionType
  110. parms.compressKb = '500'
  111. }
  112. let system = this.isAndroidOrIos()
  113. if (system === 1) {
  114. //android
  115. // 判断当前环境是是否存在 js桥 'sap'
  116. const hasSap = window.hasOwnProperty('sap')
  117. if (hasSap) {
  118. // 判断是否存在方法 ?preview
  119. const fun = sap.hasOwnProperty('openCamera')
  120. if (fun) {
  121. sap.openCamera(JSON.stringify(parms))
  122. }
  123. }
  124. }
  125. if (system === 2) {
  126. //ios
  127. // 判断 ios是否存在方法 preview
  128. const preview = window.webkit.messageHandlers.hasOwnProperty('openCamera')
  129. if (preview) {
  130. window.webkit.messageHandlers.openCamera.postMessage(JSON.stringify(parms))
  131. }
  132. }
  133. },
  134. openCameraCallBack(data) {
  135. let params = {}
  136. try {
  137. let img = JSON.parse(data)
  138. params = {
  139. extension: img.extension,
  140. content: img.content
  141. }
  142. } catch (e) {
  143. params = {
  144. extension: data.extension,
  145. content: data.content
  146. }
  147. }
  148. uploadBase64(params)
  149. .then(res => {
  150. /*上传成功*/
  151. this.$toast.success('上传成功')
  152. this.imageList.push({ name: res.data.name, url: imgUrl(res.data.url), path: res.data.url })
  153. this.$emit('input', this.imageList)
  154. })
  155. .catch(err => {
  156. /*上传失败*/
  157. this.$toast.fail('上传失败')
  158. this.fileList.splice(this.fileList.length - 1, 1)
  159. })
  160. },
  161. //删除
  162. deleteHandler() {
  163. let imageList = JSON.parse(JSON.stringify(this.fileList))
  164. imageList.forEach(item => {
  165. item.imgPath = item.path
  166. item.path = item.imgPath
  167. })
  168. this.$emit('input', imageList)
  169. }
  170. },
  171. model: {
  172. prop: 'value',
  173. event: 'input'
  174. },
  175. destroyed() {
  176. window.openCameraCallBack = null
  177. }
  178. }
  179. </script>
  180. <style lang="scss" scoped>
  181. .upload-text {
  182. font-size: 18px;
  183. color: #999;
  184. margin-top: 5px;
  185. }
  186. </style>