微信小程序原生上传图片和预览+云函数上传

1.前台页面

1.1wxml问阿金

<!-- 说明一个上传页面的按钮 -->
<button type="primary" bindtap="uploadPage">上传页面展示</button>
<!-- 声明一个上传服务器的按钮 -->
<button type="warn" bindtap="uploadSever">上传服务器</button>
<!-- 实现点击图片有个预览效果  -->
<view wx:for="{{imgSrcArr}}" bindtap="uploadPreview" wx:key="index" class="img">
<!-- 动态展示图片 -->
<image class="pic" src="{{item.tempFilePath}}" />
<!-- 删除图片 -->
<!-- catchtap并阻止其冒泡到父元素,因为父元素有updatePreview时间 -->
<view class="delete-button" catchtap="deleteImage" data-index="{{index}}">删除</view>
</view>

展示

 

 

1.2js文件

1.2.1 uploadPage

说明:调用方法就是属性值是一个函数,因此要注意this问题。要将this指向原来的位置。

  uploadPage() {// 改变this,特别是调用方法// 说明:调用方法就是属性值是一个函数,因此要注意this问题let that = thiswx.chooseMedia({count: 9, //表示可以选择的最大图片数量限制,这里设置为 9 表示最多可以选择 9 张图片mediaType: ['image'], //表示媒体文件的类型,在这里设置为 ['image'] 表示只能选择图片类型的文件sourceType: ['album', 'camera'], //表示可以选择的媒体来源,这里设置为 ['album', 'camera'] 表示可以从相册或相机进行选择camera: 'back', //表示前后摄像头的选择,默认为后置摄像头。当然设置的就是后置摄像头success(res) {that.setData({// 可以上传多张图,通过es6解构数组的方式imgSrcArr: [...that.data.imgSrcArr, ...res.tempFiles]})}})},

展示 

说明:点击上传页面展示,在这里我点击了两次 !

 

1.2.2uploadPreview

说明:需要学习Array.map方法的使用。

  // 图片预览uploadPreview() {let that = thiswx.previewImage({current: "", // 当前显示图片的http链接// 说明map方法就是遍历数字然后生成一个新的数组,item就是遍历的数组里面的对象,返回tempFilePathurls: that.data.imgSrcArr.map(item => item.tempFilePath)// 需要预览的图片http链接列表,[url,url]这样的})},

 展示

说明:点击图片后全屏显示 

1.2.3deleteImage按钮

说明:点击删除按钮删除图片

  // 删除图片deleteImage(event) {// 解构拿到数组的索引const {index} = event.currentTarget.dataset;// 拿到图片数组const {imgSrcArr} = this.data;// 删除当前索引,删除长度为1imgSrcArr.splice(index, 1);this.setData({imgSrcArr: imgSrcArr});},

sass文件

// 图片
.img {position: relative;.pic {}
// 图片里面的按钮.delete-button {position: absolute;top: 0;right: 0;padding: 4px;font-size: 15px;color: #ffffff;background-color: #BDA066;border-radius: 5px;}
}

  

说明:如果不写catchtap="deleteImage",因为事件冒泡到了父元素,触发了uploadPreview事件。

1.2.4 上传图片到服务器

说明:使用原生的上传图片目前我只能一张一张上传,因此我是采用了map方法使用,遍历数组每个值,进行上传。

  uploadSever() {let that = this
//拿到图片的url地址,map使用that.data.imgSrcArr.map(item => {wx.uploadFile({url: '***********', //服务器地址//图片的地址filePath: item.tempFilePath,// 前台必须传递image,后台规定的字段。name: 'image',success(res) {console.log(res);}})})},

 展示,图片存在云数据库的位置

 2.后端逻辑

说明:为了自己能够看,不再阐释说明。

import cloud from '@lafjs/cloud'
import { S3, PutObjectCommand } from "@aws-sdk/client-s3";
import fs from 'fs'const s3 = new S3({endpoint: cloud.env.OSS_EXTERNAL_ENDPOINT,region: cloud.env.OSS_REGION,credentials: {accessKeyId: cloud.env.OSS_ACCESS_KEY,secretAccessKey: cloud.env.OSS_ACCESS_SECRET,},forcePathStyle: true,
});
// 正文开始,这才是内容
export async function main(ctx: FunctionContext) {const image = ctx.files[0]// 判断前台上传的图片是否包含 images 字段if (image.fieldname !== "image") {// 如果不存在 images 字段,则返回错误信息return {statusCode: 400,body: JSON.stringify({error: 'Missing images field in the request.'})};}// 将图片的临时位置读取了const fileContent = fs.readFileSync(image.path); // 能够上传成功,展示图片是花的const bucket = "”************************"; // 这里改成你要上传的云储存名称// 文件的路径,存储位置就是images文件夹const path = "/images/" + image.filenameconst command = new PutObjectCommand({// 储存桶的位置Bucket: bucket,// 文件的路径Key: path,Body: fileContent,ContentType: image.mimetype,});let restry {res = await s3.send(command)// console.log("文件上传成功:", res);} catch (error) {return error}let { $metadata: { httpStatusCode } } = reslet { filename } = ctx.files[0]let fileObject = { httpStatusCode, filename }return fileObject
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四讲:MySQL中DDL一些基本数据类型及表的创建、查询

目录 1、创建表:2、DDL一些基本数据类型&#xff1a; 1、创建表: 部分单词及解析&#xff1a; 1、tables:表 2、comment:评论&#xff0c;解释 3、gender:性别 4、neighbor&#xff1a;邻居 1、创建表&#xff1a;&#xff08;注&#xff1a;在自定义数据库操作&#xff0c;…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

Leetcode 112. 路径总和

题目链接&#xff1a;https://leetcode.cn/problems/path-sum/description/ 思路 递归&#xff0c;先序遍历二叉树&#xff0c;每遍历一个节点便减去当前存储值&#xff08;targetSum targetSum - root.val&#xff09;&#xff1b;当到达某个节点等于targetSum (targetSum…

labview 子画面插入面板

1.前言 在前面一篇文章中描述了弹框式显示子画面&#xff0c; labview 弹窗(子vi)_weixin_39926429的博客-CSDN博客 本文介绍插入式显示子画面。 本文的主题在以前的文章中介绍过&#xff0c; labview 插入子面板_labview插入子面板_weixin_39926429的博客-CSDN博客 借用…

机器学习算法分类

机器学习根据任务的不同&#xff0c;可以分为监督学习、无监督学习、半监督学习、强化学习。 1. 无监督学习 训练数据不包含任何类别信息。无监督学习里典型例子是聚类。要解决的问题是聚类问题和降维问题&#xff0c;聚类算法利用样本的特征&#xff0c;将具有相似特征的样本…

微服务 云原生:搭建 K8S 集群

为节约时间和成本&#xff0c;仅供学习使用&#xff0c;直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境&#xff1a;CentOS-7-x86_64-Minimal-2009 镜像&#xff0c;为方便起见&#xff0c;直接在 root 账户下操作&#xff0c;现实情况最好不要这样做。 基础准备 关…

React18和React16合成事件原理(附图)

&#x1f4a1; React18合成事件的处理原理 “绝对不是”给当前元素基于addEventListener做的事件绑定&#xff0c;React中的合成事件&#xff0c;都是基于“事件委托”处理的&#xff01; 在React17及以后版本&#xff0c;都是委托给#root这个容器&#xff08;捕获和冒泡都做了…

【java】java中注解的简介,如何自定义注解,有哪些类型,有什么作用

java注解 注解的定义 Java 注解用于为 Java 代码提供元数据。作为元数据&#xff0c;注解不直接影响你的代码执行&#xff0c;但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。 首先要明确一点的是&#xff0c;注解并没有实际的作用&…

八股文(消息队列)

文章目录 1. RabbitMQ特点2. 如何保证消息的可靠性3. RabbitMQ消息的顺序性4. 实现RabbitMQ的高可用性5. 如何解决消息队列的延时以及过期失效问题&#xff1f;6. RabbitMQ死信队列7. RabbitMQ延迟队列8.RabbitMQ的工作模式9. RabbitMQ消息如何传输10. 核心概念10.1 生产者和消…

SpringBoot整合Spring Security实现权限控制

文章目录 Spring Security介绍Spring Security案例1、快速搭建一个springboot工程2、导入SpringSecurity整合springboot工程3、认证3.1、登录流程校验3.2、入门案例的原理3.3、实现思路3.4、实现认证流程&#xff08;自定义&#xff09;3.5、正式实现3.5.1 实现数据库的校验3.5…

python node Ubuntu 安装软件、删除软件 、更新软件 中的 软件源概念

在Node 用npm 安装软件 在Python 用 pip 安装软件 在Ubuntu 用 apt 、apt-get 、snap 安装软件 因为这三款软件 都是国外的&#xff0c; 软件包&#xff08;模块&#xff09;都放在国外的&#xff0c; 安装 、更新 特别慢 Node中配置 下载源 在 node 中 要配置 下载的的地址…

【C语言初阶】指针的运算or数组与指针的关系你了解吗?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针运算&#x1f4ad; 指针-整数&#x1f4ad; 指针-指针&#x1f4ad; 指针…

关于K8s的Pod的详解(一)

关于K8s的Pod的详解&#xff08;一&#xff09; Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建&#xff0c;调度&#xff0c;管理的基本单位。由上级的Controller对Node上安装的Kubelet发…

电脑安装双系统ubuntu18.04+windows后开机直接进入Windows解决方法

电脑型号&#xff1a;联想拯救者Y9000K2021H 系统&#xff1a;Windows11Ubuntu18.04双系统 问题&#xff1a;笔记本安装双系统后&#xff0c;Windows系统下处理word或者看论文&#xff1b;Ubuntu18.04系统安装ros进行机械臂控制等的研究。但最近开机后发现没有系统选项了&#…

网络传输媒体

物理层下面的传输媒体分为两种&#xff1a;导向型传输媒体和非导向型传输媒体。 一、导向型传输媒体 同轴电缆&#xff1a; 图示&#xff1a; 分类&#xff1a; 基带同轴电缆&#xff1a;用于数字传输&#xff0c;在早期局域网中广泛使用宽带同轴电缆&#xff1a;用于模拟传输…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里&#xff0c;而是BinTree里 递归的两种写法 从上往下&#xff1a;同一对象的递归&#xff08;参数多一个&#xff0c;判空用一句话&#xff09;&#xff0c;子对象的递归&#xff08;参数void&#xff0c;判空用两句话&#…

python数据分析05—Pandas数据处理

目录 1.缺失数据处理 1.1 DataFrame自身产生的缺失数据 1.2 缺失数据判断和统计 ​1.3 缺失数据清理 2. 多源数据操作 2.1 合并函数&#xff1a;merge() 2.2 连接函数&#xff1a;join() 2.3 指定方向合并&#xff1a;concat() 3. 数据分组和聚合运算 3.1 groupby()方…

(34)继电器开关

文章目录 前言 34.1 装有IOMCU的自动驾驶仪上的继电器引脚 34.2 通过任务规划器定义继电器引脚 34.3 飞行员控制继电器 34.4 任务控制继电器 34.5 任务规划器控制继电器 前言 "继电器"是自动驾驶仪上的一个数字输出引脚&#xff0c;可在 0V 和 3.3V 或 5V 之间…

《向量数据库指南》:使用公共的Pinecone数据集

目录 数据集包含向量和元数据 列出公共数据集 加载数据集 迭代数据集 分批迭代文档并插入到索引中。 将数据集插入为数据帧。 接下来怎么做 本文档介绍如何使用现有的Pinecone数据集。 要了解创建和列出数据集的方法,请参阅创建数据集。 数据集包含向量和元数据 P…

WPF 搜索框控件样式

WPF 搜索框控件样式 完全通过Xaml代码实现&#xff0c;使用了UserControl进行封装。功能包括聚焦时控件展开&#xff0c;输入为空时的文字提示&#xff0c;以及待选提示项列表等效果。实现效果如下图&#xff1a; xaml代码 <UserControl x:Class"SearchBar.SearchBo…