当前位置: 首页 > news >正文

在uniapp中使用navigator.MediaDevices.getUserMedia()拍照并上传服务器

产品提了这样一个需求:
移动端拍照上传后图片不保存在用户设备上,试了好几种方法,uni-file-picker、uni.chooseImage、input type=‘file’,安卓手机都会默认把图片保存在手机,于是各种查资料,找到了以下方法,已验证可行。

1、获取摄像头权限并显示视频流:‌
使用navigator.mediaDevices.getUserMedia()获取摄像头权限,‌并将视频流显示在video标签中。‌
2、拍照:‌
使用HTML的canvas标签来截取当前摄像头的画面,‌并将其转换为图片格式。‌
3、上传图片:‌
使用uniapp的uni.uploadFile()方法将图片上传到服务器。‌

<view class="container"><button @click="initCamera">打开摄像头</button><button @click="takePhoto">拍照</button>
</view>
data() {return {stream: null,videoElement: null}}
mounted() {this.createVideoElement()
},methods: {createVideoElement() {// 一定要用createElement创建 video和canvas 元素,否则用不了其中的方法this.videoElement = document.createElement('video')this.videoElement.setAttribute('autoplay', '')this.videoElement.setAttribute('muted', '')this.videoElement.setAttribute('playsinline', '')// 添加到 DOM 中const container = document.querySelector('.container')container.appendChild(this.videoElement)},async initCamera() {if (this.stream) {this.stopCamera()}try {const constraints = { video: { facingMode: 'environment' }}const stream = await navigator.mediaDevices.getUserMedia(constraints)this.stream = streamthis.videoElement.srcObject = stream} catch (error) {console.error('Error accessing camera:', error)}},// 关闭摄像头stopCamera() {if (this.stream) {this.stream.getTracks().forEach(track => track.stop())this.stream = nullthis.videoElement.srcObject = null}},takePhoto() {this.captureImage()this.stopCamera()},async captureImage() {const canvas = document.createElement('canvas')canvas.width = this.videoElement.clientWidthcanvas.height = this.videoElement.clientHeightconst ctx = canvas.getContext('2d')ctx.drawImage(this.videoElement, 0, 0, canvas.width, canvas.height)// 转化成base64的编码格式const dataUrl = canvas.toDataURL('image/jpeg')this._uploadFileBase64(dataUrl)},// 上传到远程地址_uploadFileBase64(imgUrl) {uploadFileBase64(imgUrl).then(response => {if (response && response.SavePath) {console.log(response.SavePath)this.$uniToast('上传成功')} else {this.$uniToast('上传失败')}})}
}
http://www.lryc.cn/news/426063.html

相关文章:

  • PULLUP
  • 【无标题】乐天HIQ壁挂炉使用
  • 使用Python编写AI程序,让机器变得更智能
  • VScode + PlatformIO 和 Keil 开发 STM32
  • PostgreSQL 练习 ---- psql 新增连接参数
  • pdf翻译软件哪个好用?多语言轻松转
  • 培训第三十天(ansible模块的使用)
  • 关于Log4net的使用记录——无法生成日志文件输出
  • golang Kratos 概念
  • 入门 MySQL 数据库:基础指南
  • 【Hexo系列】【3】使用GitHub自带的自定义域名解析
  • 智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
  • 本地创建PyPI镜像
  • 使用 Elasticsearch RestHighLevelClient 进行查询
  • 【jvm】符号引用
  • 征服云端:Java微服务与Docker容器化之旅
  • python 如何实现执行selenium自动化测试用例自动录屏?
  • 03 网络编程 TCP传输控制协议
  • 1. 数据结构——顺序表的主要操作
  • [openSSL]TLS 1.3握手分析
  • 无人机之螺旋桨的安装与维护
  • 手机设备IP地址切换:方法、应用与注意事项
  • 华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!
  • 《SPSS零基础入门教程》学习笔记——05.模型入门
  • 如何用不到一分钟的时间将Excel电子表格转换为应用程序
  • WordPress 中 cURL 请求出现 504 网关超时错误的解决方法
  • 事件和委托的区别
  • 低功耗蓝牙协议栈如何学习?
  • ROS 2中,CMakeList.txt常见语法
  • 使用 prefetchComponents 进行组件预取