微信JSSDK实现打开摄像头拍照再将相片保存到服务器


Posted in Javascript onNovember 15, 2019

在微信端打开手机摄像头拍照,将拍照图片保存到服务器上需要使用到微信的JSSDK接口,主要使用到了拍照或从手机相册中选图接口(chooseImage),上传图片接口(uploadImage)

参考资料:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

https://www.easywechat.com/docs/3.x/material

一:引入微信js

<script src="http://res2.wx.qq.com/open/js/jweixin-1.4.0.js "></script>

二:通过config接口注入权限验证配置

wx.config(<?php
  echo Yii::$app->wechat->js->config([
    'chooseImage',
    'uploadImage',
    'downloadImage'
  ])
  ?>
);

三:微信端拍照接口

wx.chooseImage({
  count: 1, // 默认9
  sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  success: function (res) {
    var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
  }
});

四:将照片上传到微信服务器接口

wx.uploadImage({
  localId: localIds, // 需要上传的图片的本地ID,由chooseImage接口获得
  isShowProgressTips: 1, // 默认为1,显示进度提示
  success: function (res) {
    var serverId = res.serverId; // 返回图片的服务器端ID
  },
  fail: function() {
    //上传图片到微信服务器失败
    return false;
  }
});

五:将微信服务器的图片下载到本地服务器

前端:

//url表示php接口地址
//serverId表示图片的服务器端ID
$.post(url, {'media_id':serverId}, function(data) {
  if (data.type == 'success') {
    //上传成功
    
  } else {
    //上传失败
    
  }
});

php(接口)

public function actionUpload()
{
  Yii::$app->response->format = Response::FORMAT_JSON;
  $request = Yii::$app->request;
  $mediaId = $request->post('media_id');
  if (empty($mediaId)) {
    return [
      'type' => 'error',
      'message' => '参数错误!'
    ];
  }
  //临时素材
  $temporary = Yii::$app->wechat->material_temporary;
  //创建服务器目录
  $path = 'wechat/' . date('Ymd',time()) . '/';
  $fullPath = Yii::getAlias('@webroot') . '/' . $path;
  if (!is_dir($fullPath)) {
    FileHelper::createDirectory($fullPath);
  }
  //设置图片名称
  $fileName = Yii::$app->getSecurity()->generateRandomString() . '-' . date('His',time());
  //将服务器端的临时素材下载到本地服务器
  $temporary->download($mediaId, $fullPath, $fileName);
  return [
    'type' => 'success',
    'url' => $path . $fileName . '.jpg',
  ];
}

前端代码整合

<!--引入微信js-->
<script src="http://res2.wx.qq.com/open/js/jweixin-1.4.0.js "></script>
<button class="btn">点击</button>
<img id="imgTarget" src="" alt="">
<?php
$url = \yii\helpers\Url::to(['/wechat/upload']);
$wxConfig = Yii::$app->wechat->js->config([
  'chooseImage',
  'uploadImage',
  'downloadImage'
]);
$JS = <<<JS
//注入权限验证配置
wx.config(
  {$wxConfig}
);
$('.btn').click(function () {
    wx.ready(function(){
      wx.chooseImage({
        count: 1, // 默认9
        sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
        sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
        success: function (res) {
          var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
          uploadImage(localIds.toString())
        }
      });
    })
  });
  /**
   * 上传图片到微信服务器
   */
  function uploadImage(localIds) {
    wx.uploadImage({
      localId: localIds, // 需要上传的图片的本地ID,由chooseImage接口获得
      isShowProgressTips: 1, // 默认为1,显示进度提示
      success: function (res) {
        var serverId = res.serverId; // 返回图片的服务器端ID
        downloadImage(serverId.toString());
      },
      fail: function() {
        //上传图片到微信服务器失败
        alert('上传图片到微信服务器失败');
        return false;
      }
    });
  }
  /**
   * 将微信服务端的图片下载到本地服务器
   */
  function downloadImage(serverId) {
    //url表示php接口地址
    //serverId表示图片的服务器端ID
    $.post(url, {'media_id':serverId}, function(data) {
      if (data.type == 'success') {
        //上传成功
        alert(data.url);
      } else {
        //上传失败
        alert(data.message)
      }
    });
  }
JS;
$this->registerJs($JS);
?>

根据如上代码就可以实现微信端打开摄像头拍照再将相片保存到服务器功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 判断 object 的特定类转载
Feb 01 Javascript
JS面向对象编程 for Cookie
Sep 19 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
Apr 07 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 Javascript
JavaScript检测并限制复选框选中个数的方法
Aug 12 Javascript
js中常用的Tab切换效果(推荐)
Aug 30 Javascript
JS实现图片上传预览功能
Nov 21 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
node.js遍历目录的方法示例
Aug 01 Javascript
关于JavaScript数组去重的一些理解汇总
Sep 10 Javascript
详解JS WebSocket断开原因和心跳机制
May 07 Javascript
微信小程序自定义导航栏(模板化)
Nov 15 #Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 #Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 #Javascript
create-react-app中添加less支持的实现
Nov 15 #Javascript
taro小程序添加骨架屏的实现代码
Nov 15 #Javascript
详解Angular Karma测试的持续集成实践
Nov 15 #Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
Nov 15 #Javascript
You might like
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
用jscript启动sqlserver
2007/06/21 Javascript
WordPress JQuery处理沙发头像
2009/06/22 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
python正则表达式之作业计算器
2016/03/18 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python破解zip加密文件的方法
2018/05/31 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
简单了解python中对象的取反运算符
2019/07/01 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
一个入门级python爬虫教程详解
2021/01/27 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
《莫高窟》教学反思
2014/02/25 职场文书
大学毕业寄语大全
2014/04/10 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
小学家长通知书评语
2014/12/31 职场文书
网吧温馨提示
2015/07/17 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
MySQL root密码的重置方法
2021/04/21 MySQL