uniapp3.0实现图片上传公用组件上传uni-file-picker,uni.uploadFile

用uniapp3.0的写法组合式api,setup形式封装一个图片上传公用组件,要求

1、使用uni-file-picker选择文件

2、uni.uploadFile上传图片

3、要能支持上传接口动态化

4、支持删除如片列表中已上传项

5、可以预览已上传列表图片

6、支持动态化限制图片格式,图片大小,

7、上传成功后走公用组件返回图片列表list,

具体的封装代码,和在页面使用该组件的例子

组件ImageUploader.vue

<template>
  <view class="image-uploader">
    <view class="header">
      <text>图片上传</text>
      <text>{{ uploadedFiles.length }}/{{ maxCount }}</text>
    </view>
    <uni-file-picker multiple :limit="maxCount" :disable="uploadedFiles.length >= maxCount" @select="onFileChange"
      :ext-class="filePickerClass" :file-extname="allowedFormats" @delete="removeImage">
      <view class="upload-btn">
        <uni-icons type="camera-filled" color="#007aff" size="40"></uni-icons>
      </view>
    </uni-file-picker>
  </view>
</template>

<script setup>
  let base = import.meta.env.VITE_APP_BASE_API
  let token = uni.getStorageSync(ACCESS_TOKEN)
  const props = defineProps({
    maxCount: {
      type: Number,
      default: 1
    },
    uploadUrl: {
      type: String,
      default: '/ap/files/upload555'//自己的上传地址
    },
    allowedFormats: {
      type: Array,
      default: () => ['jpg', 'jpeg', 'png', 'gif']
    },
    maxSize: {
      type: Number,
      default: 5 * 1024 * 1024 // 5MB
    },
    value: {
      type: Array,
      default: () => {
        return [];
      },
    },
  })
  const emit = defineEmits(['update:list'])

  const uploadedFiles = computed({
    get: () => {
      return props.value;
    },
    set: (val) => {
      emit('update:value', val);
    },
  });
  const onFileChange = async (files) => {
    console.log('files', files)
    // const files = event.detail.tempFiles
    const filelist = files.tempFiles; // 获取选中的文件


    for (const file of filelist) {
      if (!props.allowedFormats.includes(file.name.split('.').pop().toLowerCase())) {
        uni.showToast({
          title: '不支持的文件格式',
          icon: 'none'
        })
        continue
      }

      if (file.size > props.maxSize) {
        uni.showToast({
          title: '文件大小超出限制',
          icon: 'none'
        })
        continue
      }
      console.log('hsjhj')
      uni.uploadFile({
        url: base + props.uploadUrl,
        filePath: file.path,
        name: 'file', // 这里根据API的要求来定义
        header: {
          // 'Content-Type': 'multipart/form-data', // 设置上传文件的 Content-Type
          'Authorization': `Bearer ${token}`, // 自定义头部信息,比如 Authorization
          'Tenant-Id': 1,
          'CLIENT-TOC': 'Y'
        },
        success: (uploadFileRes) => {
          console.log('upload success:', uploadFileRes);
          let data = JSON.parse(uploadFileRes.data)
          console.log('upload success: data', data);
          if (data && data.code == 0) {
            uploadedFiles.value.push({
              url: data.data.url
            })
            console.log('uploadedFiles.value', uploadedFiles.value.length);
            emit('update:list', uploadedFiles.value)
          } else {
            tip.error('上传失败')
          }

        },
        fail: (error) => {
          console.error('upload fail:', error);
          tip.error('上传失败')
          // 处理上传失败的逻辑
        }
      });

    }
  }

  const previewImage = (url) => {
    uni.previewImage({
      urls: uploadedFiles.value.map(file => file.url),
      current: url
    })
  }

  const removeImage = (file) => {
    console.log('hhj', file)
    uploadedFiles.value.splice(file.index, 1)
    emit('update:list', uploadedFiles.value)
  }

  const filePickerClass = {
    'file-picker': true,
    'disabled': uploadedFiles.value.length >= props.maxCount
  }
</script>

<style scoped>
  .image-uploader {
    padding: 16px;
    background-color: #fff;
    border-radius: 8px;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
  }

  .header {
    display: flex;
    justify-content: space-between;
    margin-bottom: 8px;
  }

  .upload-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 80px;
    height: 80px;
    border: 2px dashed #ddd;
    border-radius: 8px;
    color: #bbb;
  }
</style>

页面使用,预留了上传成功后的回调方法,可不传,也可以直接v-model绑定
 

      <imageUploader :max-count="4" @update:list="updateImageList" v-model:value="imageList"/>
 const imageList = ref([])
 const updateImageList = (list) => {
    console.log('imageList444',imageList)
    // imageList.value = list ,//可以赋值也可以做其他操作
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用Uni-App的开发者来说,可以使用Uni-File-Picker组件实现图片上传的功能。下面是一个示例代码,展示了如何使用Uni-File-Picker组件上传图片: 1. 首先在页面的vue文件中引入Uni-File-Picker组件: ``` <template> <view> <uni-file-picker :count="1" @success="uploadSuccess" @fail="uploadFail" ></uni-file-picker> <button type="primary" @click="upload">上传图片</button> </view> </template> <script> export default { methods: { uploadSuccess(files) { console.log('上传成功', files); // 在这里处理上传成功后的逻辑 }, uploadFail(err) { console.log('上传失败', err); // 在这里处理上传失败后的逻辑 }, upload() { uni.chooseImage({ count: 1, success: (res) => { const tempFiles = res.tempFiles; if (tempFiles.length > 0) { uni.uploadFile({ url: 'http://your-upload-url', filePath: tempFiles[0].path, name: 'file', success: (res) => { if (res.statusCode === 200) { const data = JSON.parse(res.data); if (data.code === 0) { this.uploadSuccess(data.files); } else { this.uploadFail(data.message); } } else { this.uploadFail('上传失败'); } }, fail: (err) => { this.uploadFail(err.errMsg); } }); } }, fail: (err) => { console.log('选择图片失败', err); } }); } } } </script> ``` 在上面的示例中,Uni-File-Picker组件用于选择图片文件,并通过`count`属性限制只能选择1张图片。当选择成功后,会触发`success`事件,调用`uploadSuccess`方法进行上传成功后的处理;当选择失败后,会触发`fail`事件,调用`uploadFail`方法进行上传失败后的处理。 在`upload`方法中,首先使用`uni.chooseImage`选择图片,并通过`uni.uploadFile`将选中的图片上传到服务器。在上传成功后,通过`uploadSuccess`方法处理上传成功后的逻辑;在上传失败后,通过`uploadFail`方法处理上传失败后的逻辑。 需要注意的是,示例中的上传接口URL需要根据实际情况进行修改。另外,还可以根据需要添加进度条等其他功能来完善上传图片的交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值