index.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. var component_1 = require("../common/component");
  15. var utils_1 = require("./utils");
  16. component_1.VantComponent({
  17. props: {
  18. disabled: Boolean,
  19. multiple: Boolean,
  20. uploadText: String,
  21. useBeforeRead: Boolean,
  22. previewSize: {
  23. type: null,
  24. value: 90
  25. },
  26. name: {
  27. type: [Number, String],
  28. value: ''
  29. },
  30. accept: {
  31. type: String,
  32. value: 'image'
  33. },
  34. sizeType: {
  35. type: Array,
  36. value: ['original', 'compressed']
  37. },
  38. capture: {
  39. type: Array,
  40. value: ['album', 'camera']
  41. },
  42. fileList: {
  43. type: Array,
  44. value: [],
  45. observer: 'formatFileList'
  46. },
  47. maxSize: {
  48. type: Number,
  49. value: Number.MAX_VALUE
  50. },
  51. maxCount: {
  52. type: Number,
  53. value: 100
  54. },
  55. deletable: {
  56. type: Boolean,
  57. value: true
  58. },
  59. previewImage: {
  60. type: Boolean,
  61. value: true
  62. },
  63. previewFullImage: {
  64. type: Boolean,
  65. value: true
  66. },
  67. imageFit: {
  68. type: String,
  69. value: 'scaleToFill'
  70. },
  71. camera: {
  72. type: String,
  73. value: 'back'
  74. },
  75. compressed: {
  76. type: Boolean,
  77. value: true
  78. },
  79. maxDuration: {
  80. type: Number,
  81. value: 60
  82. }
  83. },
  84. data: {
  85. lists: [],
  86. computedPreviewSize: '',
  87. isInCount: true
  88. },
  89. methods: {
  90. formatFileList: function () {
  91. var _a = this.data, _b = _a.fileList, fileList = _b === void 0 ? [] : _b, maxCount = _a.maxCount;
  92. var lists = fileList.map(function (item) { return (__assign(__assign({}, item), { isImage: typeof item.isImage === 'undefined' ? utils_1.isImageFile(item) : item.isImage })); });
  93. this.setData({ lists: lists, isInCount: lists.length < maxCount });
  94. },
  95. startUpload: function () {
  96. var _this = this;
  97. if (this.data.disabled)
  98. return;
  99. var _a = this.data, _b = _a.name, name = _b === void 0 ? '' : _b, capture = _a.capture, maxCount = _a.maxCount, multiple = _a.multiple, maxSize = _a.maxSize, accept = _a.accept, sizeType = _a.sizeType, lists = _a.lists, camera = _a.camera, compressed = _a.compressed, maxDuration = _a.maxDuration, _c = _a.useBeforeRead // 是否定义了 beforeRead
  100. , useBeforeRead = _c === void 0 ? false : _c // 是否定义了 beforeRead
  101. ;
  102. var chooseFile = null;
  103. var newMaxCount = maxCount - lists.length;
  104. // 设置为只选择图片的时候使用 chooseImage 来实现
  105. if (accept === 'image') {
  106. chooseFile = new Promise(function (resolve, reject) {
  107. wx.chooseImage({
  108. count: multiple ? (newMaxCount > 9 ? 9 : newMaxCount) : 1,
  109. sourceType: capture,
  110. sizeType: sizeType,
  111. success: resolve,
  112. fail: reject
  113. });
  114. });
  115. }
  116. else if (accept === 'video') {
  117. chooseFile = new Promise(function (resolve, reject) {
  118. wx.chooseVideo({
  119. sourceType: capture,
  120. compressed: compressed,
  121. maxDuration: maxDuration,
  122. camera: camera,
  123. success: resolve,
  124. fail: reject
  125. });
  126. });
  127. }
  128. else {
  129. chooseFile = new Promise(function (resolve, reject) {
  130. wx.chooseMessageFile({
  131. count: multiple ? newMaxCount : 1,
  132. type: 'file',
  133. success: resolve,
  134. fail: reject
  135. });
  136. });
  137. }
  138. chooseFile
  139. .then(function (res) {
  140. var file = null;
  141. if (utils_1.isVideo(res, accept)) {
  142. file = __assign({ path: res.tempFilePath }, res);
  143. }
  144. else {
  145. file = multiple ? res.tempFiles : res.tempFiles[0];
  146. }
  147. // 检查文件大小
  148. if (file instanceof Array) {
  149. var sizeEnable = file.every(function (item) { return item.size <= maxSize; });
  150. if (!sizeEnable) {
  151. _this.$emit('oversize', { name: name });
  152. return;
  153. }
  154. }
  155. else if (file.size > maxSize) {
  156. _this.$emit('oversize', { name: name });
  157. return;
  158. }
  159. // 触发上传之前的钩子函数
  160. if (useBeforeRead) {
  161. _this.$emit('before-read', {
  162. file: file,
  163. name: name,
  164. callback: function (result) {
  165. if (result) {
  166. // 开始上传
  167. _this.$emit('after-read', { file: file, name: name });
  168. }
  169. }
  170. });
  171. }
  172. else {
  173. _this.$emit('after-read', { file: file, name: name });
  174. }
  175. })
  176. .catch(function (error) {
  177. _this.$emit('error', error);
  178. });
  179. },
  180. deleteItem: function (event) {
  181. var index = event.currentTarget.dataset.index;
  182. this.$emit('delete', { index: index, name: this.data.name });
  183. },
  184. doPreviewImage: function (event) {
  185. if (!this.data.previewFullImage)
  186. return;
  187. var curUrl = event.currentTarget.dataset.url;
  188. var images = this.data.lists
  189. .filter(function (item) { return item.isImage; })
  190. .map(function (item) { return item.url || item.path; });
  191. this.$emit('click-preview', { url: curUrl, name: this.data.name });
  192. wx.previewImage({
  193. urls: images,
  194. current: curUrl,
  195. fail: function () {
  196. wx.showToast({ title: '预览图片失败', icon: 'none' });
  197. }
  198. });
  199. }
  200. }
  201. });