前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JS打开摄像头并截图上传

JS打开摄像头并截图上传

作者头像
书童小二
发布于 2018-09-03 11:29:04
发布于 2018-09-03 11:29:04
5.9K00
代码可运行
举报
文章被收录于专栏:前端儿前端儿
运行总次数:0
代码可运行

直入正题,JS打开摄像头并截图上传至后端的一个完整步骤

1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签 2. 截取图片主要用到canvas绘图,使用drawImage方法将video的内容绘至canvas中 3. 将截取的内容上传至服务器,将canvas中的内容转为base64格式上传,后端(PHP)通过file_put_contents将其转为图片

要注意的是,在chrome以外的浏览器中,使用摄像头或多或少会出现一些问题,可能也是老问题了,所以以下代码主要基于chrome使用

比如在最新版FireFox中的报错,不知为啥

1. 打开摄像头

getUserMedia 有新版本和旧版本两种,建议使用新版本

旧版本位于navigator 对象下,根据浏览器不同有所不同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取媒体方法(旧方法)
    navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (navigator.getMedia) {
        navigator.getMedia({
            video: true
        }, function(stream) {
            mediaStreamTrack = stream.getTracks()[0];

            video.src = (window.URL || window.webkitURL).createObjectURL(stream);
            video.play();
        }, function(err) {
            console.log(err);
        });
    }

第一个参数中指示需要使用视频(video)或音频(audio),更多参见文档

第二个参数中指示调用成功后的回调,其中带一个参数(MediaStream),在旧版本中可以直接通过调用MediaStream.stop() 来关闭摄像头,不过在新版之中已废弃。需要使用MediaStream.getTracks()[index].stop() 来关闭相应的Track

第三个参数指示调用失败后的回调

新版本位于navigator.mediaDevices 对象下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({
            video: true,
            audio: true
        }).then(function(stream) {
            console.log(stream);

            mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];

            video.src = (window.URL || window.webkitURL).createObjectURL(stream);
            video.play();
        }).catch(function(err) {
            console.log(err);
        })
    }

与旧版类似,不过该方法返回了一个Promise对象,可以使用then和catch表示成功与失败的回调

更多参见文档

需要注意的是,MediaStream.getTracks() 返回的Tracks数组是按第一个参数倒序排列的

比如现在定义了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    video: true,
    audio: true
}

想关闭摄像头,就需要调用MediaStream.getTracks()[1].stop();

同理,0对应于audio的track

使用createObjectURL 将MediaStream写入video标签,就能够存储实时的媒体流数据(也可以方便的实时查看画面)

旧版本中webkitURL 对象以不被支持,需要使用URL对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <video width="200" height="150"></video>
    <canvas width="200" height="150"></canvas>

    <p>
        <button id="snap">截取图像</button>
        <button id="close">关闭摄像头</button>
        <button id="upload">上传图像</button>
    </p>

    <img id="uploaded" width="200" height="150" />

2. 截取图像

将内容写入即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 截取图像
    snap.addEventListener('click', function() {
        context.drawImage(video, 0, 0, 200, 150);
    }, false);

3. 关闭摄像头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 关闭摄像头
    close.addEventListener('click', function() {
        mediaStreamTrack && mediaStreamTrack.stop();
    }, false);

4. 上传截取的图像

canvas.toDataURL('image/png')

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 上传截取的图像
    upload.addEventListener('click', function() {
        jQuery.post('/uploadSnap.php', {
            snapData: canvas.toDataURL('image/png')
        }).done(function(rs) {
            rs = JSON.parse(rs);

            console.log(rs);

            uploaded.src = rs.path;
        }).fail(function(err) {
            console.log(err);
        });
    }, false);

而这里的后端(PHP)则将获取的内容转换成图像文件保存

需要注意的是,要将base64的头部信息字段去掉再保存,否则似乎图像是损坏无法打开滴

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

    $snapData = $_POST['snapData'];
    $snapData = str_replace('data:image/png;base64,', '', $snapData);
    // $snapData = str_replace(' ', '+', $snapData);

    $img = base64_decode($snapData);

    $uploadDir = 'upload/';
    $fileName = date('YmdHis', time()) . uniqid();

    if (!(file_put_contents($uploadDir . $fileName, $img))) {
        echo json_encode(array('code' => 500, 'msg' => '文件上传失败'));
    } else {
        echo json_encode(array('code' => 200, 'msg' => '文件上传成功', 'path' => $uploadDir . $fileName));
    }

?>

完整JS代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 <script type="text/javascript" src="jquery.js"></script>
 2     <script type="text/javascript">
 3     function $(elem) {
 4         return document.querySelector(elem);
 5     }
 6 
 7     // 获取媒体方法(旧方法)
 8     navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
 9 
10     var canvas = $('canvas'),
11         context = canvas.getContext('2d'),
12         video = $('video'),
13         snap = $('#snap'),
14         close = $('#close'),
15         upload = $('#upload'),
16         uploaded = $('#uploaded'),
17         mediaStreamTrack;
18 
19     // 获取媒体方法(新方法)
20     // 使用新方法打开摄像头
21     if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
22         navigator.mediaDevices.getUserMedia({
23             video: true,
24             audio: true
25         }).then(function(stream) {
26             console.log(stream);
27 
28             mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];
29 
30             video.src = (window.URL || window.webkitURL).createObjectURL(stream);
31             video.play();
32         }).catch(function(err) {
33             console.log(err);
34         })
35     }
36     // 使用旧方法打开摄像头
37     else if (navigator.getMedia) {
38         navigator.getMedia({
39             video: true
40         }, function(stream) {
41             mediaStreamTrack = stream.getTracks()[0];
42 
43             video.src = (window.URL || window.webkitURL).createObjectURL(stream);
44             video.play();
45         }, function(err) {
46             console.log(err);
47         });
48     }
49 
50     // 截取图像
51     snap.addEventListener('click', function() {
52         context.drawImage(video, 0, 0, 200, 150);
53     }, false);
54 
55     // 关闭摄像头
56     close.addEventListener('click', function() {
57         mediaStreamTrack && mediaStreamTrack.stop();
58     }, false);
59 
60     // 上传截取的图像
61     upload.addEventListener('click', function() {
62         jQuery.post('/uploadSnap.php', {
63             snapData: canvas.toDataURL('image/png')
64         }).done(function(rs) {
65             rs = JSON.parse(rs);
66 
67             console.log(rs);
68 
69             uploaded.src = rs.path;
70         }).fail(function(err) {
71             console.log(err);
72         });
73     }, false);
74 
75     </script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB学习(六)数据库的备份、还原、导入及导出
2017年02月22日 19:17:51 代码与酒 阅读数 21333 标签: 数据库mongodb备份还原 更多
拓荒者
2019/06/15
5.3K0
如何在Ubuntu 14.04上备份,还原和迁移MongoDB数据库
MongoDB是最受欢迎的NoSQL数据库引擎之一。它以可扩展,强大,可靠和易于使用而闻名。在本文中,我们将向您展示如何备份,还原和迁移MongoDB数据库。
信姜缘
2018/08/03
1.3K0
如何在Ubuntu 14.04上创建和使用MongoDB备份
今天许多现代Web应用程序开发人员都选择在他们的项目中使用NoSQL数据库,而MongoDB通常是他们的首选。如果您在生产场景中使用MongoDB,则定期创建备份以避免数据丢失非常重要。幸运的是,MongoDB提供了简单的命令行工具来创建和使用备份。本教程将介绍如何使用这些工具。
藕丝空间
2018/09/25
1K0
mongodb11天之屠龙宝刀(十) 备份 还原 导出 导入::CSV,JSON,BOSN,解决中文乱码
mongodb11天之屠龙宝刀(十) 备份 还原 导出 导入::CSV,JSON,BOSN,解决中文乱码 mongodb数据备份和还原主要二种形式 一种是针对于库的mongodump和mongorestore, 一种是针对库中表的mongoexport和mongoimport。 一,mongodump备份数据库 1,常用命令格 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果没有用户谁,可以去掉-u和-p。 如果导出本机的数据库
学到老
2018/03/19
1K0
mongodb11天之屠龙宝刀(十) 备份 还原 导出 导入::CSV,JSON,BOSN,解决中文乱码
010.MongoDB备份恢复
mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
木二
2019/07/01
2.7K0
MongoDB常用命令大全,概述、备份恢复
还记得MySQL、Redis、PostgreSQL、ClickHouse常用命令及操作吗?如果忘记可以到这里重新温习:MySQL常用命令,Redis常用命令,PostgreSQL常用命令,ClickHouse常用命令,启动、关闭、连接、备份、导入导出。本文重点讲述MongoDB常用命令。
寻求出路的程序媛
2024/07/17
9910
mongodb数据库迁移备份数据
使用mongo自带命令来迁移数据,思路是先导出集合数据再导入到数据库中 导出命令:mongoexport 语法:mongoexport -d dbname -c collectionname -o filepath --type json/csv -f field
Alone88
2020/06/11
2.4K0
MongoDB的备份和恢复(一)
MongoDB备份的主要目的是将当前的数据库状态保存到一个可靠的位置,以便以后可以恢复数据库到该状态。MongoDB备份有两种方式:物理备份和逻辑备份。
堕落飞鸟
2023/05/09
1.5K0
mongodb官网下载不了, MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门[通俗易懂]
MongoDB 将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。
全栈程序员站长
2022/07/25
7.4K0
mongodb官网下载不了, MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门[通俗易懂]
mongodb 备份、还原、导出、导入
mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
飞奔去旅行
2019/06/13
6.5K0
数据库安全之MongoDB渗透
本篇文章是MongoDB数据库信息泄露漏洞复现,记录了实际中常见的MongoDB数据库未授权访问漏洞并如何使用,主要分为七个部分:MongoDB简介、MongoDB安装、MongoDB基本操作、MongoDB相关工具使用、MongoDB漏洞复现、MongoDB实战和MongoDB防御措施。 本篇文章由浅入深地介绍了MongoDB未配置访问认证授权导致的未授权访问漏洞。在学习MongoDB过程中也阅读了几十篇中英文MongoDB相关技术文章,最终按照作者我的思路进行总结,相关参考文章也在文末列出。 此外,文中
FB客服
2023/03/30
2.2K0
数据库安全之MongoDB渗透
MongoDB 备份与还原 mongodump、mongorestore
​ mongodump 是 MongoDB 官方提供的备份工具,它可以从 MongoDB 数据库读取数据,并生成 BSON 文件,mongodump 适合用于备份和恢复数据量较小的 MongoDB 数据库,不适用于大数据量备份。
拓荒者
2019/06/22
2.6K0
MongoDB 备份与还原 mongodump、mongorestore
​mongodump 是 MongoDB 官方提供的备份工具,它可以从 MongoDB 数据库读取数据,并生成 BSON 文件,mongodump 适合用于备份和恢复数据量较小的 MongoDB 数据库,不适用于大数据量备份。
星哥玩云
2022/08/18
1.4K0
MongoDB 安装和可视化工具
MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,我选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在Windows Server 2012环境中。
加米谷大数据
2018/07/25
1.7K0
MongoDB 安装和可视化工具
MongoDB 备份与恢复
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。
为为为什么
2024/08/22
2030
MongoDB数据库备份(mongodump)以及恢复(mongorestore)工具实践
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,备份后添加修改的数据都会被删除,谨慎使用!!!
Balliol Chen
2022/05/11
8.2K0
4.0版本以上mongodb在Windows下载安装-添加Windows服务-安装可视化工具管理数据教程
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。最近用到了这个数据库存储json,下载时,出现了许多问题,走了很多坑,希望通过这篇文章,小伙伴可以更快安装好该软件。
jiankang666
2022/05/12
1.1K0
4.0版本以上mongodb在Windows下载安装-添加Windows服务-安装可视化工具管理数据教程
MongoDB的备份和恢复(二)
MongoDB的恢复过程与备份过程相反。MongoDB提供了多种方式来恢复备份数据。以下是一些常见的恢复方法:
堕落飞鸟
2023/05/09
5920
MongoDB踩坑总结
参与的项目需要导出远程机器上的MongoDB的数据库,由于之前没有接触过MongoDB的数据库,所以出现了很多问题,现总结下。
acoolgiser
2019/01/17
9840
MongoDB的备份与恢复
1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore      有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。    该命令的参数如下: 参数 参数说明 -h 指明数据库宿主机的IP
惨绿少年
2018/03/30
4.5K0
推荐阅读
相关推荐
MongoDB学习(六)数据库的备份、还原、导入及导出
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文