Upload 上传

该组件用于上传图片场景

平台差异说明

AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序

基本使用

  • 可以通过设置file-list参数(数组,元素为对象),显示预置的图片。其中元素的url属性为图片路径
  • 设置action参数为后端服务器地址,注意H5在浏览器可能会有跨域限制,让后端允许域即可
  1. <template>
  2. <u-upload :action="action" :file-list="fileList" ></u-upload>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. // 演示地址,请勿直接使用
  8. action: 'http://www.example.com/upload',
  9. fileList: [
  10. {
  11. url: 'http://pics.sc.chinaz.com/files/pic/pic9/201912/hpic1886.jpg',
  12. }
  13. ]
  14. }
  15. }
  16. </script>

手动上传

组件默认为自动上传,可以设置auto-uploadfalse,然后通过ref调用组件的upload方法,手动上传图片

  1. <template>
  2. <view>
  3. <u-upload ref="uUpload" :action="action" :auto-upload="false" ></u-upload>
  4. <u-button @click="submit">提交</u-button>
  5. </view>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. // 非真实地址
  11. action: 'http://www.example.com/upload',
  12. },
  13. methods: {
  14. submit() {
  15. this.$refs.uUpload.upload();
  16. },
  17. }
  18. }
  19. </script>

获取上传的图片列表

图片选择或者上传成功后,会保存在组件内部的lists数组中,数组元素为对象,有如下属性:

  • url: 图片地址
  • error:组件内部使用,不应根据此值判断上传是否成功,而应根据progress属性
  • progress:如果值为100,表示图片上传成功
  • response:上传成功后,服务器返回的数据,这是最有用的了

为了获得上传的文件列表,应该监听on-uploaded,此事件表示现有的文件队列已经上传完毕(包括自动和手动上传)

  1. <template>
  2. <view>
  3. <u-upload ref="uUpload" @on-uploaded="onUploaded" :action="action" :auto-upload="false" ></u-upload>
  4. <u-button @click="submit">提交</u-button>
  5. </view>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. action: 'http://www.example.com/upload',
  11. filesArr: []
  12. },
  13. methods: {
  14. submit() {
  15. this.$refs.uUpload.upload();
  16. },
  17. onUploaded(lists) {
  18. this.filesArr = lists;
  19. }
  20. }
  21. }
  22. </script>

报错提示

在以下几种情况,组件会默认通过toast提示用户信息,可以把show-tips设置为false取消默认的提示,这时可以通过API 中的各种事件,进行自定义的个性化提示

  • 超出允许的最大上传数量
  • 图片大小超出最大允许大小
  • 上传图片出错
  • 移除图片

以下示例为屏蔽组件内部的提示,在移除图片时,监听onRemove事件,手动提示的情况

  1. <template>
  2. <u-upload ref="uUpload" :action="action" :show-tips="false" @on-remove="onRemove"></u-upload>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. action: 'http://www.example.com/upload',
  8. },
  9. methods: {
  10. onRemove(index, lists) {
  11. console.log('图片已被移除')
  12. },
  13. }
  14. }
  15. </script>

限制图片数量和大小

  • 通过max-count可以设置最多可以选择的图片的数量
  • 通过max-size设置单张图片最大的大小,单位为B(byte),默认不限制

下方示例为单张最大为5M,最多选择6张的情况:

  1. <u-upload :max-size="5 * 1024 * 1024" max-count="6"></u-upload>

自定义相关说明

  1. 组件内部样式
    组件默认选取图片会展示预览缩略图,包括默认的选取图片的按钮,他们的宽高都是200rpxborder-radius值为10rpx, 另外预览图片的盒子有一个默认的边框,值为border: 1px solid rgb(235, 236, 238)。如果用户需要自定义上传按钮,可以参考这些值。

  2. 自定义上传按钮
    通过传递名为addBtnslot,同时配置custom-btntrue,可以自定义想要的上传按钮。

如下所示:

  1. <u-upload :custom-btn="true">
  2. <view slot="addBtn" class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150">
  3. <u-icon name="photo" size="60" :color="$u.color['lightColor']"></u-icon>
  4. </view>
  5. </u-upload>
  6. <style>
  7. .slot-btn {
  8. width: 329rpx;
  9. height: 140rpx;
  10. display: flex;
  11. justify-content: center;
  12. align-items: center;
  13. background: rgb(244, 245, 246);
  14. border-radius: 10rpx;
  15. }
  16. .slot-btn__hover {
  17. background-color: rgb(235, 236, 238);
  18. }
  19. </style>
  1. 自定义预览列表 首先需要设置show-upload-listfalse来去除组件内部的默认预览列表,其次需要通过ref获取组件,进而 操作组件内部的变量和方法,下面为一些组件内部的方法和变量说明:
  • lists(变量),可以通过此值,构建自定义的预览列表,该变量内部如下:
  1. lists = [
  2. {
  3. url: 'xxx.png', // 预览图片的地址
  4. error: false, // 上传失败,此值为true
  5. progress: 100, // 0-100之间的值
  6. },
  7. ......
  8. ]
  • deleteItem(index)(方法),可以用此方法在自定义列表中通过ref删除某一张图片

以下为完整的自定义图片预览列表示例:

  1. <template>
  2. <view class="wrap">
  3. <view class="pre-box" v-if="!showUploadList">
  4. <view class="pre-item" v-for="(item, index) in uUpload.lists" :key="index">
  5. <image class="pre-item-image" :src="item.url" mode="aspectFill"></image>
  6. <view class="u-delete-icon" @tap.stop="uUpload.deleteItem(index)">
  7. <u-icon name="close" size="20" color="#ffffff"></u-icon>
  8. </view>
  9. <u-line-progress v-if="item.progress > 0 && !item.error" :show-percent="false" height="16" class="u-progress"
  10. :percent="item.progress"></u-line-progress>
  11. </view>
  12. </view>
  13. <u-upload :custom-btn="true" ref="uUpload" :show-upload-list="showUploadList" :action="action">
  14. <view slot="addBtn" class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150">
  15. <u-icon name="photo" size="60" :color="$u.color['lightColor']"></u-icon>
  16. </view>
  17. </u-upload>
  18. </view>
  19. </template>
  20. <script>
  21. export default {
  22. data() {
  23. return {
  24. action: 'http://192.168.100.17/index.php/index/index/upload', // 演示地址
  25. showUploadList: false,
  26. uUpload: {}, // 组件实例
  27. }
  28. },
  29. // 只有onReady生命周期才能调用refs操作组件
  30. onReady() {
  31. // 得到整个组件对象,内部图片列表变量为"lists"
  32. this.uUpload = this.$refs.uUpload;
  33. },
  34. methods: {
  35. }
  36. }
  37. </script>
  38. <style lang="scss">
  39. .wrap {
  40. padding: 24rpx;
  41. }
  42. .slot-btn {
  43. width: 341rpx;
  44. height: 140rpx;
  45. display: flex;
  46. justify-content: center;
  47. align-items: center;
  48. background: rgb(244, 245, 246);
  49. border-radius: 10rpx;
  50. }
  51. .slot-btn__hover {
  52. background-color: rgb(235, 236, 238);
  53. }
  54. .pre-box {
  55. display: flex;
  56. align-items: center;
  57. justify-content: space-between;
  58. flex-wrap: wrap;
  59. }
  60. .pre-item {
  61. flex: 0 0 48.5%;
  62. border-radius: 10rpx;
  63. height: 140rpx;
  64. overflow: hidden;
  65. position: relative;
  66. margin-bottom: 20rpx;
  67. }
  68. .u-progress {
  69. position: absolute;
  70. bottom: 10rpx;
  71. left: 8rpx;
  72. right: 8rpx;
  73. z-index: 9;
  74. width: auto;
  75. }
  76. .pre-item-image {
  77. width: 100%;
  78. height: 140rpx;
  79. }
  80. .u-delete-icon {
  81. position: absolute;
  82. top: 10rpx;
  83. right: 10rpx;
  84. z-index: 10;
  85. background-color: $u-type-error;
  86. border-radius: 100rpx;
  87. width: 44rpx;
  88. height: 44rpx;
  89. display: flex;
  90. align-items: center;
  91. justify-content: center;
  92. }
  93. </style>

API

Props

参数说明类型默认值可选值
action服务器上传地址String--
max-count最大选择图片的数量String | Number99-
width图片预览区域和添加图片按钮的宽度(高等于宽),单位rpx,不能是百分比,或者autoString | Number200-
custom-btn如果需要自定义选择图片的按钮,设置为trueBooleanfalsetrue
show-progress是否显示进度条Booleantruefalse
disabled是否启用(显示/移仓)组件Booleanfalsetrue
image-mode预览图片等显示模式,可选值为uni的image的mode属性值StringaspectFill-
header上传携带的头信息,对象形式Object{}-
form-data上传额外携带的参数Object{}-
name上传文件的字段名,供后端获取使用Stringfile-
size-typeoriginal 原图,compressed 压缩图,默认二者都有Array<String>[‘original’, ‘compressed’]-
source-type选择图片的来源,album-从相册选图,camera-使用相机,默认二者都有Array<String>[‘album’, ‘camera’]-
preview-full-image是否可以通过uni.previewImage预览已选择的图片Booleantruefalse
multiple是否开启图片多选,部分安卓机型不支持Booleantruefalse
deletable是否显示删除图片的按钮Booleantruefalse
max-size选择单个文件的最大大小,单位B(byte),默认不限制String | NumberNumber.MAX_VALUE-
file-list默认显示的图片列表,数组元素为对象,必须提供url属性Array<Object>--
upload-text选择图片按钮的提示文字Boolean选择图片-
auto-upload选择完图片是否自动上传,见上方说明Booleantruefalse
show-tips特殊情况下是否自动提示toast,见上方说明Booleantruefalse
del-bg-color右上角删除图标的颜色,只能为uView内置图标Stringclose-
del-icon右上角删除图标名称,只能为uView内置图标Stringclose-
del-bg-color右上角关闭按钮的背景颜色String#fa3534-
del-color右上角关闭按钮图标的颜色String#ffffff-

Methods

此方法如要通过ref手动调用

名称说明
upload调用此方法,手动上传图片
clear调用此方法,清空内部文件列表
reUpload调用此方法,重新上传内部上传失败或者尚未上传的图片
remove(index)手动移除列表的某一个图片,indexlists数组的索引

Slot

名称说明版本
addBtn自定义的选择图片按钮-

Events

回调参数中的lists参数,为目前组件内的所有图片数组,index为当前操作的图片的索引

事件名说明回调参数
on-oversize图片大小超出最大允许大小(file, lists)
on-preview全屏预览图片时触发(url, lists),url为当前选中的图片地址
on-remove移除图片时触发(index, lists)
on-success图片上传成功时触发(data, index, lists),data为服务器返回的数据
on-change图片上传后,无论成功或者失败都会触发(res, index, lists),res为服务器返回的信息
on-error图片上传失败时触发(res, index, lists),res为服务器返回的信息
on-progress图片上传过程中的进度变化过程触发(res, index, lists),res为服务器返回的信息,具体参数请打印查看
on-uploaded所有图片上传完毕触发(lists),可以通过此事件,将lists参数获取,提交给后端使用
on-choose-complete每次选择图片后触发,只是让外部可以得知每次选择后,内部的文件列表(lists),内部当前的文件列表
on-list-change当内部文件列表被加入文件、移除文件,或手动调用clear方法时触发(lists)