【教程】微信小程序如何拍摄图片及视频并上传到后台进行存储

需求分析

微信小程序中需要使用手机拍摄照片以及视频上传到后台进行进一步的操作,需要解决以下两个问题:

  1. 微信小程序如何拍摄照片及视频
  2. 如何将拍摄的照片及视频上传到后台进行存储

解决方案

前端开发:微信小程序原生

后端开发:Flask

如何拍摄照片及视频

微信小程序如何拍摄照片及视频:使用wx.chooseMediaAPI来实现

该API用于拍摄或从手机相册中选择图片或视频,文档链接为:wx.chooseMedia(Object object) | 微信开放文档

简单示例:

function test()
{wx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['camera'],camera: 'back',success(res) {console.log(res)},fail(res){console.log(res)}})
}

主要参数含义如下:

  • count:最多可以选择的文件个数
  • mediaType:文件类型,可选值为:['image']/['video']/['image','video'],默认值为['image','video'],意为即允许拍摄图片也允许拍摄视频
  • sourceType:文件来源,可选值为['album']/[ 'camera']/['album', 'camera'],默认值为['album', 'camera'],意为即允许从相册选择,也允许直接拍摄
  • camera:仅在 sourceType 为 camera 时生效,使用前置或后置摄像头,可选值为'back'/'front',默认值为'back'

回调参数res内容如下:

  • tempFiles:本地临时文件列表,其中的tempFilePath是本地临时文件路径,也是该示例中的核心参数;
  • type:文件类型

(更多参数以及回调参数请参考官方文档)

由上可知,我们首选需要调用wx.chooseMedia函数,选择拍摄照片或者视频,然后在回调函数中拿到本地临时文件路径,这样就获取到了拍摄的照片或视频,但我们拿到的并不是一个完整的.png/.mp4文件,而是一个临时文件链接,例如:http://tmp/z7bXVKwgyWTKcbc89c663afd501de1d27ed321f8591c.jpg

这样的文件链接可以在开发者工具中打开:

但该链接无法在外部进行访问,因此就涉及到如何将该链接所代表的文件上传到后台的问题;

这样的文件在小程序中被称为”本地临时文件“,仅在当前生命周期内保证有效,重启之后不一定可用;更多内容请参考官方文档:文件系统 | 微信开放文档

如何上传后台进行存储

如何将拍摄的照片及视频上传到后台进行存储:

  • 前端:使用wx.uploadFileAPI
  • 后端:使用request.files['photo'].stream.read()来读取文件

前端代码

有关wx.uploadFile可以参考:UploadTask | 微信开放文档

主要参数有:

  • url:开发者服务器地址,即要访问的接口
  • filePath:要上传的文件路径(本地路径),这里即是通过wx.chooseMedia回调中的tempFilePath
  • formData:HTTP 请求中其他额外的 form data,允许我们传输文件的时候携带一些其他的参数,比如说文件名称;

因此完整的前端代码如下(上传图片):

//拍摄照片
photoCapture() {let that = thiswx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['camera'],camera: 'back',success(res) {that.setData({photoLink: res.tempFiles[0].tempFilePath,})console.log(res.tempFiles[0].tempFilePath)console.log('图片拍摄成功')wx.showLoading({title: '正在上传图片',mask: true})//图片上传wx.uploadFile({url: 'http://localhost:5000/uploadImage',filePath: res.tempFiles[0].tempFilePath,name: 'photo',formData: {fileName: 'photoTest.png'},success(res) {wx.showToast({title: '图片上传成功',})}})},fail(res) {console.log('图片拍摄失败')}})
}

首先拍摄照片,然后上传文件

后端代码

后端使用flask进行开发

通过request.files来接收文件

通过request.form来接收wx.uploadFileformData中携带的数据

通过write方法将接收到的文件保存到本地

因此完整的后端代码如下(上传图片):

app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World'# 图片上传
@app.route('/uploadImage', methods=["POST"])
def uploadImage():video = request.files['photo'].stream.read()name = request.form['fileName']if not files_exists(name, 2):file_path = os.getcwd() + '\\images\\' + namewith open(file_path, 'ab') as f:f.write(video)return 'image upload success'else:return 'image already exist'# 判断文件是否已经存在
def files_exists(file_name, choice):if choice == 1:path = os.getcwd() + '\\videos\\'video_path = os.path.join(path, file_name)return os.path.isfile(video_path)else:path = os.getcwd() + '\\images\\'image_path = os.path.join(path, file_name)return os.path.isfile(image_path)if __name__ == '__main__':app.run(host='127.0.0.1', port=5000)

运行结果

首先启动后端服务,然后小程序初始页面如下:

点击按钮拍摄图片,可以看到图片成功预览在小程序中:

在NetWork中可以看到接口的返回值:

图片上传成功;在后端也能看到图片已经保存下来了:

所有代码

前端代码

index.wxml:

<button type="primary" bind:tap="photoCapture">点击拍摄图片</button>
<image src="{{photoLink}}"></image>
<button type="primary" bind:tap="videoCapture">点击拍摄视频</button>
<image src="{{videoLink}}"></image>

index.wxss:

page {padding-top: 100rpx;height: 100vh;display: flex;flex-direction: column;align-items: center;
}
image{margin-top: 50rpx;margin-bottom: 50rpx;width: 600rpx;height: 400rpx;border: 1px solid black;
}

index.js:

Page({data: {photoLink: '',videoLink: '',},//拍摄照片photoCapture() {let that = thiswx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['camera'],camera: 'back',success(res) {that.setData({photoLink: res.tempFiles[0].tempFilePath,})console.log(res.tempFiles[0].tempFilePath)console.log('图片拍摄成功')wx.showLoading({title: '正在上传图片',mask: true})//图片上传wx.uploadFile({url:'http://localhost:5000/uploadImage',filePath: res.tempFiles[0].tempFilePath,name: 'photo',formData: {fileName:'photoTest.png'},success(res) {wx.showToast({title: res.data,})}})},fail(res) {console.log('图片拍摄失败')}})},//拍摄视频videoCapture() {let that = thiswx.chooseMedia({count: 1,mediaType: ['video'],sourceType: ['camera'],maxDuration: 60,camera: 'back',success(res) {that.setData({videoLink: res.tempFiles[0].thumbTempFilePath})console.log('视频拍摄成功')console.log(res.tempFiles[0].tempFilePath)wx.showLoading({title: '正在上传视频',mask: true})//视频上传wx.uploadFile({url:'http://localhost:5000/uploadVideo',filePath: res.tempFiles[0].tempFilePath,name: 'video',formData: {fileName:'videoTest.mp4'},success(res) {wx.showToast({title: res.data,})}})},fail(res) {console.log('图片拍摄失败')}})}
})

后端代码

from flask import Flask, request
import osapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World'@app.route('/uploadVideo', methods=["POST"])
def uploadVideo():video = request.files['video'].stream.read()name = request.form['fileName']if not files_exists(name, 1):file_path = os.getcwd() + '\\videos\\' + namewith open(file_path, 'ab') as f:f.write(video)return 'upload success'else:return 'already exist'@app.route('/uploadImage', methods=["POST"])
def uploadImage():video = request.files['photo'].stream.read()name = request.form['fileName']if not files_exists(name, 2):file_path = os.getcwd() + '\\images\\' + namewith open(file_path, 'ab') as f:f.write(video)return 'upload success'else:return 'already exist'def files_exists(file_name, choice):if choice == 1:path = os.getcwd() + '\\videos\\'video_path = os.path.join(path, file_name)return os.path.isfile(video_path)else:path = os.getcwd() + '\\images\\'image_path = os.path.join(path, file_name)return os.path.isfile(image_path)if __name__ == '__main__':app.run(host='127.0.0.1', port=5000)

此外文件上传到后台也可以采用base64编码的方式进行上传

在我的这篇文章的【头像昵称填写】部分有所提及:微信小程序用户登录及头像昵称设置教程(前后端)_微信小程序-原生开发用户登录-CSDN博客

欢迎大家讨论交流~ 

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

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

相关文章

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

0x32 约数

0x32 约数 定义 若整数 n n n除以整数 d d d的余数为0&#xff0c;即 d d d能整除 n n n&#xff0c;则称 d d d是 n n n的约数&#xff0c; n n n是 d d d的倍数&#xff0c;记为 d ∣ n d|n d∣n。 算术基本定理的推论 在算术基本定理中&#xff0c;若正整数 N N N被唯一…

c 小熊猫 c++ IDE编译ffmpeg 设置

菜单-》运行-》编译器选项-》链接时加入下列选项 &#xff1a; -I /usr/local/ffmpeg/include -L /usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lm 本机ffmpeg存储位置&#xff1a;include &#xff1a;/usr/local/ff…

十三、QPalette的简单使用(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在实际应用中&#xff0c;经常需要改变某个控件的颜色外观&#xff0c;如背景、文字颜色等。Qt提供的调色板类 QPalette 专门用于管理对话框的外观显示。QPalette 类相当于对话框或是控件的调色板&…

metartc5_jz源码阅读-yang_rtcpush_on_rtcp_ps_feedback

// (Payload-specific FB messages&#xff0c;有效载荷反馈信息)&#xff0c;这个函数处理Payload重传 int32_t yang_rtcpush_on_rtcp_ps_feedback(YangRtcContext *context,YangRtcPushStream *pub, YangRtcpCommon *rtcp) {if (context NULL || pub NULL)return ERROR_RTC…

记录:排查create_ap偶发无法开启自发AP的问题

背景说明&#xff1a; 系统&#xff1a;Xubuntu16.04&#xff1b;内核&#xff1a;4.14&#xff1b;无线网卡&#xff1a;EDIMAX EW-7822UAC 关于无线网卡的驱动安装和create_ap配置参考博文&#xff1a;Xubuntu16.04系统中使用EDIMAX EW-7822UAC无线网卡开启5G自发AP 目录 问题…

分布式系统的三字真经CAP

文章目录 前言C&#xff08;Consistency 数据一致性&#xff09;A&#xff08;Availability 服务可用性&#xff09;P&#xff08;Partition Tolerance 分区容错性&#xff09;CAP理论最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我一起探索一下分布式系统的三字真经C…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

解决ssh: connect to host github.com port 22: Connection refused

ssh: connect to host github.com port 22: Connection refused 是连接github.com的端口号22拒绝连接。 可以使用github的443端口。 解决方案 在~/.ssh/config中添加如下字段&#xff1a; $ vim ~/.ssh/config # 如果没有config 文件就新建一个 Host github.comHostname ss…

Jmeter 性能-监控服务器

Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip) JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip) ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Perform…

xtu-c语言考试复习-2

1223 确实写不出&#xff0c;数据远超过64位&#xff0c;难道用数组存吗&#xff0c;但是不好计算&#xff0c;想到的思路是取模&#xff0c;一边计算&#xff0c;一边取模&#xff0c;就不会超过数据范围&#xff0c;但是数学原理没懂&#xff0c;所以做不出来 看了下自己以…

AIGC视频生成:Pika1.0快速入门详解

Pika1.0快速入门详解 一、简介二、登录三、参数设置1、改变画面大小&#xff08;Aspect ratio&#xff09;2、改变帧数大小&#xff08;Frames per second&#xff09;3、镜头平移&#xff08;Camera control&#xff09;4、画面运动控制&#xff08;Strength of motion&#x…

VCG 网格面片法向量平滑

文章目录 一、简介二、实现代码三、实现效果一、简介 思路其实很简单,即是将当前面的法线替换为该面相邻面的法线的平均值,当前邻近法线需要根据邻近面片的面积进行加权。虽然思路很简单,但是很有效,这对一些重建算法效果也有所提升。 二、实现代码 //VCG #include <vc…

永不停止,永远在路上!MIAOYUN 2023年度回顾

2023 MIAOYUN年度关键词&#xff1a;坚持/沉淀/成长 2023年&#xff0c;我们身处虚浮遥荡的世界&#xff1a;支原体肺炎、流感接二连三、经济下行成热词、人人思危&#xff1b;更有暴雨成灾&#xff0c;核污水扩散&#xff0c;战火与地震不断。 坏事发生时&#xff0c;你有三种…

【NLP】多标签分类【上】

简介 《【NLP】多标签分类》主要介绍利用三种机器学习方法和一种序列生成方法来解决多标签分类问题&#xff08;包含实验与对应代码&#xff09;。共分为上下两篇&#xff0c;上篇聚焦三种机器学习方法&#xff0c;分别是&#xff1a;Binary Relevance (BR)、Classifier Chain…

绝地求生:【PC】第27赛季第2轮更新公告

各位玩家大家好&#xff01;欢迎收看本期闲游盒更新公告。 正式服维护时间 ※ 下列时间可能会根据维护情况而发生变化。 1月10日上午8:00 – 下午4:30 地图轮换 ※ 地图轮换将于每周三上午10点进行。 ※ 在随机选择地图的地区中&#xff0c;第1周可选择荣都地图&#xff0c…

Intellij-idea 如何编译maven工程*

在 Intellij IDEA 中编译 Maven 工程的步骤如下&#xff1a; 打开你的 Maven 工程。如果工程已经在 IDEA 中打开&#xff0c;那么你可以直接进行下一步。如果没有&#xff0c;你可以通过File -> Open 在弹出的对话框中选择你的 Maven 工程路径进行打开。 打开 Maven 项目窗…

Java SE入门及基础(11)

程序调试 1. 什么是程序调试 当程序出现问题时&#xff0c;我们希望程序能够暂停下来&#xff0c;然后通过我们操作使代码逐行执行&#xff0c;观察整个过程中变量的变化是否按照我们设计程序的思维变化&#xff0c;从而找问题并解决问题&#xff0c;这个过程称之为程序调试…

从零开发短视频电商 PaddleOCR Java推理 (一)飞桨引擎推理

文章目录 简介方式一&#xff1a;DJL 飞浆引擎 飞桨模型方式二&#xff1a;ONNXRuntime 飞桨转换后的ONNX模型&#xff08;Paddle2ONNX&#xff09; 添加依赖文字识别OCR过程分析文字区域检测文字角度检测文字识别&#xff08;裁减旋转后的文字区域&#xff09; 高级替换模型…