首页 > 编程语言 >微信小程序中图片上传

微信小程序中图片上传

时间:2023-03-31 17:03:24浏览次数:37  
标签:const success 微信 data accessoryFileList 上传 图片

封装了图片上传组件,支持多张上传,图片预览
代码如下:
组件调用:
index.tsx

<UploadPic
  maxNumber={3}
  fileList={pics}
  fileChange={(e) => {
    console.log('e', e)
    setPics(e)
  }}
/>

图片上传封装
UploadPic.tsx

import React from 'react';
import Taro from '@tarojs/taro';
import { View } from '@tarojs/components';
import { previewImage } from './previewImage';
import isFunction from 'lodash/isFunction';
import AtImagePicker from 'taro-ui/lib/components/image-picker';

const BaseUrl: string = '10.220.xxxx/api/';

export const UploadPic: React.FC<any> = ({
  maxNumber = 3, // 最大数量
  fileList = [], // 默认显示图片
  previewAble = true,
  fileChange,
}) => {


  const _accessoryFileList: any[] = [...fileList] // 后端用图片格式 arr

  const onChange = (files, doType, index) => {
    if (doType === 'add') {
      // add file
      const waitingUploadFiles = files.filter(f => !(f.url.includes('oss/')))
      uploadFile({ path: waitingUploadFiles });
    } else {
      // remove file
      _accessoryFileList.splice(index, 1)
      _fileChange(_accessoryFileList);
    }
  };

  const uploadFile = (data) => {
    let i = data.i ? data.i : 0 // 当前所上传的图片位置
    let success = data.success ? data.success : 0//上传成功的个数
    let fail = data.fail ? data.fail : 0;//上传失败的个数
    Taro.showLoading({
      title: `正在上传第${i + 1}张`
    })
    //发起上传
    Taro.uploadFile({
      url: `${BaseUrl}/upload`,
      header: {
        'content-type': 'multipart/form-data',
        // 'token': data.token // 上传需要单独处理token
      },
      name: 'file',
      filePath: data.path[i].url,
      success: (res) => {
        //图片上传成功,图片上传成功的变量+1
        const responseData = JSON.parse(res.data);
        // console.log('responseData', responseData)
        if (responseData && responseData?.code === 200 && responseData?.data) {
          success++;

          let imgAcc: any = null;
          if (responseData?.data?.downloadUrl) {
            const { downloadUrl } = responseData?.data
            imgAcc = {
              url: downloadUrl
            }
          }

          imgAcc && _accessoryFileList.push(imgAcc)
        } else {
          fail++;

          Taro.showToast({
            title: '上传失败,请稍后重试',
            icon: 'none',
          });
        }
      },
      fail: () => {
        fail++;//图片上传失败,图片上传失败的变量+1
      },
      complete: () => {
        Taro.hideLoading()
        i++;//这个图片执行完上传后,开始上传下一张
        if (i == data.path.length) {   //当图片传完时,停止调用
          Taro.showToast({
            title: '上传成功',
            icon: 'success',
            duration: 2000
          })

          console.log('成功:' + success + " 失败:" + fail);
          _fileChange(_accessoryFileList);
          console.log('----------------_accessoryFileList', _accessoryFileList)
        } else {//若图片还没有传完,则继续调用函数
          data.i = i;
          data.success = success;
          data.fail = fail;
          uploadFile(data);
        }
      }
    })
  }

  const _fileChange = (_accessoryFileList) => {
    isFunction(fileChange) && fileChange(_accessoryFileList);
  };

  return (
    <View>
      <AtImagePicker
        multiple
        length={3}
        count={9}
        files={fileList}
        onImageClick={(i) => previewAble && previewImage(i, fileList)}
        onChange={onChange}
        showAddBtn={fileList.length < maxNumber}
      />
    </View>
  );
}

图片预览代码:
previewImage.ts

export function previewImage(i, fileList) {

  const urls = fileList.map(item => item.url);

  wx.previewImage({
    current: urls[i], // 当前显示图片的http链接
    urls, // 需要预览的图片http链接列表
  })
}

标签:const,success,微信,data,accessoryFileList,上传,图片
From: https://www.cnblogs.com/ZerlinM/p/17276785.html

相关文章

  • 秀米新技能:如何在秀米推文中上传附件?如Word、Excel、PPT、PDF等
    发表公众号推文的时候,有不少人使用秀米作为公众号的图文排版工具。作为深受运营人喜爱的一款排版工具,排版案例拿来即用,方便了不少我们这种爱偷懒的运营人。在实际的运营工作中,我们经常需要在公众号发表一些带有附件的文章,比如岗位需求表、报名申请表、成绩公示表、比赛晋级名单、......
  • SpringBoot 集成微信支付的各种支付产品
    SpringBoot是一款非常流行的Java开发框架,而微信支付则是众多移动支付产品中的佼佼者,整合两者可以让我们更方便地开发各种支付产品。在本篇博客中,我将介绍如何在SpringBoot中整合微信支付的各种支付产品。准备工作微信支付官网注册一个微信支付商户账号创建一个微信支付应用......
  • 微信小程序累计独立访客(UV)不低于 1000 是什么意思
    首先微信小程序“累计独立访客(UV)不低于1000”是指UV是UniqueVisitor的英文缩写,1天内相同的访客多次访问您的网站只计算1个UV,以cookie为依据。简单的说就是指:累计的不同IP的访客合计达到1000+才能开通流量主独立访客(UV)名词:UV=UniqueVisitor(独立访客数)说明:1天内相同的访客多......
  • 微信小程序i18n文件夹新增语言文件报:module is not defined
    背景:微信开发者工具的版本:1.06.2303060Stable 解决步骤:1.首先需要排除的是代码逻辑层面没有问题,对应要require的js文件也存在。2.升级微信开发者工具到最新版本3.打开详情=》本地设置,把“将JS编译成ES5”的去掉勾选后再次选择4.重新打开项目......
  • 网页编辑器粘贴图片自动上传到服务器(Java版)
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • 分析微信好友数据,可以可视化好友男女比例分布,可视化省份来源,可视化签名的情感强度值
    一、分析数据可视化好友男女分布比例 1plt.rcParams['font.sans-serif']=['SimHei']2#用来正常显示中文标签3plt.rcParams['axes.unicode_minus']=False45#1.读取csv文件,把性别信息读取出来6defgetSex(filename):7lstsex=[]8withopen(fi......
  • 直播网站源码,Android中点击图片放大的简单方法
    直播网站源码,Android中点击图片放大的简单方法简单的思路就是把要放大的图片显示在一个对话框中显示出来 Java代码: publicvoidonThumbnailClick(Viewv){//finalAlertDialogdialog=newAlertDialog.Builder(this).create();//ImageViewimgView=getView();//di......
  • Qt音视频开发32-qmedia内核回调拿图片数据
    一、前言使用qmediaplayer来打开视频并播放,默认首选会采用QVideoWidget控件来展示,优点是不用自己来绘制,一切交给了QVideoWidget控件,这样可以做到极低的CPU占用,缺点也明显,就是无法拿到每一帧的图片,很多时候我们还需要主动拿到每一帧的图片来运算做人工智能,通过不断的截图虽然也能......
  • HTML编辑器粘贴图片自动上传到服务器(Java版)
    ​ 由于工作需要必须将word文档内容粘贴到编辑器中使用但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直接解决这个问题考虑到自己除了工作其他时间基本上不使用windows,因此打算使用nodejs来解......
  • ABAP 发送邮件(正文部分需要表格&图片)
      上面截图是最后开发交付截图,左上角是公司LOGO,正文部分是表格。现在开始开发邮件发送部分1.上传图片选择MIME知识库,选中SAP-PUBLIC导入MIME对象 选择图片上传即可2.写程序(程序部分只有发送邮件关键内容部分)DATA:ls_data TYPE ty_data,       lt_data TY......