image-upload.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <view @click="selectAndUpload()">
  3. <slot></slot>
  4. </view>
  5. </template>
  6. <script>
  7. import UNI_APP from '@/.env.js'
  8. export default {
  9. name: "image-upload",
  10. data() {
  11. return {
  12. uploadHeaders: {
  13. "accessToken": uni.getStorageSync('loginInfo').accessToken
  14. }
  15. }
  16. },
  17. props: {
  18. maxCount:{
  19. type: Number,
  20. default: 1
  21. },
  22. maxSize: {
  23. type: Number,
  24. default: 5*1024*1024
  25. },
  26. sourceType:{
  27. type: String,
  28. default: 'album'
  29. },
  30. onBefore: {
  31. type: Function,
  32. default: null
  33. },
  34. onSuccess: {
  35. type: Function,
  36. default: null
  37. },
  38. onError: {
  39. type: Function,
  40. default: null
  41. }
  42. },
  43. methods: {
  44. selectAndUpload() {
  45. uni.chooseImage({
  46. count: this.maxCount, //最多可以选择的图片张数,默认9
  47. sourceType: [this.sourceType], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
  48. sizeType: ['original'], //original 原图,compressed 压缩图,默认二者都有
  49. success: (res) => {
  50. res.tempFiles.forEach((file) => {
  51. // 校验大小
  52. if (this.maxSize && file.size > this.maxSize) {
  53. this.$message.error(`文件大小不能超过 ${this.fileSizeStr}!`);
  54. this.$emit("fail", file);
  55. return;
  56. }
  57. if (!this.onBefore || this.onBefore(file)) {
  58. // 调用上传图片的接口
  59. this.uploadImage(file);
  60. }
  61. })
  62. }
  63. })
  64. },
  65. uploadImage(file) {
  66. uni.uploadFile({
  67. url: UNI_APP.BASE_URL + '/image/upload',
  68. header: {
  69. accessToken: uni.getStorageSync("loginInfo").accessToken
  70. },
  71. filePath: file.path, // 要上传文件资源的路径
  72. name: 'file',
  73. success: (res) => {
  74. let data = JSON.parse(res.data);
  75. if(data.code != 200){
  76. this.onError && this.onError(file, data);
  77. }else{
  78. this.onSuccess && this.onSuccess(file, data);
  79. }
  80. },
  81. fail: (err) => {
  82. console.log(err);
  83. this.onError && this.onError(file, err);
  84. }
  85. })
  86. }
  87. },
  88. computed: {
  89. fileSizeStr() {
  90. if (this.maxSize > 1024 * 1024) {
  91. return Math.round(this.maxSize / 1024 / 1024) + "M";
  92. }
  93. if (this.maxSize > 1024) {
  94. return Math.round(this.maxSize / 1024) + "KB";
  95. }
  96. return this.maxSize + "B";
  97. }
  98. }
  99. }
  100. </script>
  101. <style>
  102. </style>