微信小程序/网站 上传图片到腾讯云COS
COS简介: 腾讯云提供的一种对象存储服务,供开发者存储海量文件的分布式存储服务。可以将自己开发的应用的存储部分全部接入COS的存储桶中,有效减少应用服务器的带宽消耗等。个人也可以通过腾讯云账号免费使用COS6个月,https://cloud.tencent.com/product/cos
整体流程简介:
1. 前端引入cos的SDK文件
2. 监听上传控件,并在图片加载至网页临时流中发起签名请求
3.后端根据上传的请求方式和路径参数返回签名Authorization和token XCosSecurityToken
4.前端再根据返回的参数和SDK以3的请求方式上传图片。
PHP签名返回流程:
1.在腾讯云的建好存储桶并配置CORS规则https://cloud.tencent.com/document/product/436/11459
2.在平台上拿到Bucket(存储桶),Region(地域),SecretId,SecretKey等参数。
3.使用(SecretId,Timestamp…)参数进行签名通过腾讯云的接口获取临时密钥,返回给前端的token也在临时密钥中
4.根据前端传的(上传请求方式,路径)和临时密钥进行签名(前端上传所使用的)并返回。
一、PHP获取签名部分(tp5)
<?php
// +----------------------------------------------------------------------
// | When work is a pleasure, life is a joy!
// +----------------------------------------------------------------------
// | User: 傅超| Email:1741108471@qq.com | Time:2018/04/21 17:55
// +----------------------------------------------------------------------
// | TITLE: 小程序接口
// +----------------------------------------------------------------------namespace app\v1\controller;use think\Request;
use think\Db;
use app\v1\location\Location;
use think\Cache;
use \app\v1\auth\AccessToken;
use \app\v1\extend\Loginlog;// 返回数据给前端
header('Content-Type: application/json');
header('Allow-Control-Allow-Origin: *'); // 这里修改允许跨域访问的网站
// header('Allow-Control-Allow-Origin: http://127.0.0.1'); // 这里修改允许跨域访问的网站
//header('Allow-Control-Allow-Origin: http://mer.runmoneyin.com'); // 这里修改允许跨域访问的网站
header('Allow-Control-Allow-Headers: origin,accept,content-type');/*** Class Cosauth* @title 获取腾讯云cos签名接口* @url http://119.29.10.64/v1/Cosauth* @desc 小程序接口包含:获取上传图片签名* @version 1.0*/
class Cosauth extends Base
{// 附加方法protected $extraActionList = ['getCosAuth', 'getCosAuth'];// 跳过验证方法protected $skipAuthActionList = ['getCosAuth', 'getCosAuthEsay'];// appid//protected $appid = 'wx4c0e1852239664b4';// cos配置参数protected $config = array('Url' => 'https://sts.api.qcloud.com/v2/index.php','Domain' => 'sts.api.qcloud.com', 'Proxy' => '','SecretId' => 'AK********************BLK9nF5dZL', // 固定密钥'SecretKey' => 'jHj5G*********************IUcqJu', // 固定密钥'Bucket' => 'activity-1255484416', // 存储桶'Region' => 'ap-guangzhou','AllowPrefix' => '*', // 这里改成允许的路径前缀,这里可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg);/*** @title 获取签名入口* http://119.29.10.64/v1/Cosauth/getCosAuth*/public function getCosAuth() {// $data['say'] = 'hello';// echo json_encode($data);// die;// 缓存临时密钥if (!isset($_SESSION['tempKeysCache'])) {$_SESSION['tempKeysCache'] = array('policyStr' => '','expiredTime' => 0);}// 获取前端过来的参数// $method = isset($_GET['method']) ? $_GET['method'] : 'get';// $pathname = isset($_GET['pathname']) ? $_GET['pathname'] : '/';$method = input('method') ? input('method') : 'post';$pathname = input('pathname') ? input('pathname') : '/';$callback = input('callback') ? input('callback') : ''; // 前端跨域的jsonp参数(可忽略)// 获取临时密钥,计算签名$tempKeys = $this->getTempKeys();if ($tempKeys && $tempKeys['credentials']) {// $datas = $this->getAuthorization($tempKeys, $method, $pathname);// echo json_encode($datas);// die;$data = array('Authorization' => $this->getAuthorization($tempKeys, $method, $pathname),'XCosSecurityToken' => $tempKeys['credentials']['sessionToken'],);} else {$data = array('error'=> $tempKeys);}//echo $callback . '(' . json_encode($data) . ')'; // 通过回调返回给其他域(可忽略)echo json_encode($data); // 正常写法的返回die;}// json 转 query stringpublic function json2str($obj, $notEncode = false) {ksort($obj);$arr = array();foreach ($obj as $key => $val) {!$notEncode && ($val = urlencode($val));array_push($arr, $key . '=' . $val);}return join('&', $arr);}// 计算临时密钥用的签名public function getSignature($opt, $key, $method) {//global $config;$formatString = $method . $this->config['Domain'] . '/v2/index.php?' . $this->json2str($opt, 1);$sign = hash_hmac('sha1', $formatString, $key);$sign = base64_encode(hex2bin($sign));return $sign;}// 获取临时密钥public function getTempKeys() {//global $config;// 判断是否修改了 AllowPrefixif ($this->config['AllowPrefix'] === '_ALLOW_DIR_/*') {return array('error'=> '请修改 AllowPrefix 配置项,指定允许上传的路径前缀');}$ShortBucketName = substr($this->config['Bucket'],0, strripos($this->config['Bucket'], '-'));$AppId = substr($this->config['Bucket'], 1 + strripos($this->config['Bucket'], '-'));$policy = array('version'=> '2.0','statement'=> array(array('action'=> array(// 简单文件操作'name/cos:PutObject','name/cos:PostObject','name/cos:AppendObject','name/cos:GetObject','name/cos:HeadObject','name/cos:OptionsObject','name/cos:PutObjectCopy','name/cos:PostObjectRestore',// 分片上传操作'name/cos:InitiateMultipartUpload','name/cos:ListMultipartUploads','name/cos:ListParts','name/cos:UploadPart','name/cos:CompleteMultipartUpload','name/cos:AbortMultipartUpload',),'effect'=> 'allow','principal'=> array('qcs'=> array('*')),'resource'=> array('qcs::cos:' . $this->config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/','qcs::cos:' . $this->config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/' . $this->config['AllowPrefix']))));$policyStr = str_replace('\\/', '/', json_encode($policy));$Action = 'GetFederationToken';$Nonce = rand(10000, 20000);$Timestamp = time() - 1;$Method = 'GET';$params = array('Action'=> $Action,'Nonce'=> $Nonce,'Region'=> '','SecretId'=> $this->config['SecretId'],'Timestamp'=> $Timestamp,'durationSeconds'=> 7200,'name'=> '','policy'=> $policyStr);$params['Signature'] = urlencode($this->getSignature($params, $this->config['SecretKey'], $Method));$url = $this->config['Url'] . '?' . $this->json2str($params, 1);$ch = curl_init($url);$this->config['Proxy'] && curl_setopt($ch, CURLOPT_PROXY, $this->config['Proxy']);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($ch);if(curl_errno($ch)) $result = curl_error($ch);curl_close($ch);$result = json_decode($result, 1);$_SESSION['tempKeysCache'] = $result['data'];$_SESSION['tempKeysCache']['policyStr'] = $policyStr;return $result['data'];}// 计算 COS API 请求用的签名public function getAuthorization($keys, $method, $pathname){// 获取个人 API 密钥 https://console.qcloud.com/capi$SecretId = $keys['credentials']['tmpSecretId'];$SecretKey = $keys['credentials']['tmpSecretKey'];// 整理参数$query = array();$headers = array();$method = strtolower($method ? $method : 'get');$pathname = $pathname ? $pathname : '/';substr($pathname, 0, 1) != '/' && ($pathname = '/' . $pathname);// 工具方法function getObjectKeys($obj){$list = array_keys($obj);sort($list);return $list;}function obj2str($obj){$list = array();$keyList = getObjectKeys($obj);$len = count($keyList);for ($i = 0; $i < $len; $i++) {$key = $keyList[$i];$val = $obj[$key] ? $obj[$key] : '';$key = strtolower($key);$list[] = rawurlencode($key) . '=' . rawurlencode($val);}return implode('&', $list);}// 签名有效起止时间$now = time() - 1;$expired = $now + 3600; // 签名过期时刻,600 秒后// 要用到的 Authorization 参数列表$qSignAlgorithm = 'sha1';$qAk = $SecretId;$qSignTime = $now . ';' . $expired;$qKeyTime = $now . ';' . $expired;$qHeaderList = strtolower(implode(';', getObjectKeys($headers)));$qUrlParamList = strtolower(implode(';', getObjectKeys($query)));// 签名算法说明文档:https://www.qcloud.com/document/product/436/7778// 步骤一:计算 SignKey$signKey = hash_hmac("sha1", $qKeyTime, $SecretKey);// 步骤二:构成 FormatString$formatString = implode("\n", array(strtolower($method), $pathname, obj2str($query), obj2str($headers), ''));// 自定义头部(暂时关闭)// header('x-test-method', $method);// header('x-test-pathname', $pathname);// 步骤三:计算 StringToSign$stringToSign = implode("\n", array('sha1', $qSignTime, sha1($formatString), ''));// 步骤四:计算 Signature$qSignature = hash_hmac('sha1', $stringToSign, $signKey);// 步骤五:构造 Authorization$authorization = implode('&', array('q-sign-algorithm=' . $qSignAlgorithm,'q-ak=' . $qAk,'q-sign-time=' . $qSignTime,'q-key-time=' . $qKeyTime,'q-header-list=' . $qHeaderList,'q-url-param-list=' . $qUrlParamList,'q-signature=' . $qSignature));return $authorization;}/*********************************************************************************************************************************************/// // cos配置参数
// protected $config = array(
// 'Url' => 'https://sts.api.qcloud.com/v2/index.php',
// 'Domain' => 'sts.api.qcloud.com',
// 'Proxy' => '',
// 'SecretId' => 'AKIDwqbCewU2ZxABC3QDWp1EWrBLK9nF5dZL', // 固定密钥
// 'SecretKey' => 'jHj5GIAvV8eFk3B8tSwKXYO4f0IUcqJu', // 固定密钥
// 'Bucket' => 'xcx-1255484416',
// 'Region' => 'ap-guangzhou',
// 'AllowPrefix' => '*', // 这里改成允许的路径前缀,这里可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg
// );
// // $config = array(
// // 'Url' => 'https://sts.api.qcloud.com/v2/index.php',
// // 'Domain' => 'sts.api.qcloud.com',
// // 'Proxy' => '',
// // 'SecretId' => 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 固定密钥
// // 'SecretKey' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 固定密钥
// // 'Bucket' => 'test-1250000000',
// // 'Region' => 'ap-guangzhou',
// // 'AllowPrefix' => '_ALLOW_DIR_/*', // 必填,这里改成允许的路径前缀,这里可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg
// // );
// // json 转 query string
// function json2str($obj, $notEncode = false)
// {// ksort($obj);
// $arr = array();
// foreach ($obj as $key => $val) {// !$notEncode && ($val = urlencode($val));
// array_push($arr, $key . '=' . $val);
// }
// return join('&', $arr);
// }// // 计算临时密钥用的签名
// function getSignature($opt, $key, $method)
// {// $formatString = $method . $this->config['Domain'] . '/v2/index.php?' . self::json2str($opt, 1);
// $sign = hash_hmac('sha1', $formatString, $key);
// $sign = base64_encode(hex2bin($sign));
// return $sign;
// }// // 获取临时密钥
// function getTempKeys()
// {// // 判断是否修改了 AllowPrefix
// if ($this->config['AllowPrefix'] === '_ALLOW_DIR_/*') {// return array('error'=> '请修改 AllowPrefix 配置项,指定允许上传的路径前缀');
// }
// // dump($this->config);
// $ShortBucketName = substr($this->config['Bucket'],0, strripos($this->config['Bucket'], '-'));
// $AppId = substr($this->config['Bucket'], 1 + strripos($this->config['Bucket'], '-'));
// $policy = array(
// 'version'=> '2.0',
// 'statement'=> array(
// array(
// 'action'=> array(
// // // 这里可以从临时密钥的权限上控制前端允许的操作
// 'name/cos:*', // 这样写可以包含下面所有权限
// // // 列出所有允许的操作
// // // ACL 读写
// // 'name/cos:GetBucketACL',
// // 'name/cos:PutBucketACL',
// // 'name/cos:GetObjectACL',
// // 'name/cos:PutObjectACL',
// // // 简单 Bucket 操作
// // 'name/cos:PutBucket',
// // 'name/cos:HeadBucket',
// // 'name/cos:GetBucket',
// // 'name/cos:DeleteBucket',
// // 'name/cos:GetBucketLocation',
// // // Versioning
// // 'name/cos:PutBucketVersioning',
// // 'name/cos:GetBucketVersioning',
// // // CORS
// // 'name/cos:PutBucketCORS',
// // 'name/cos:GetBucketCORS',
// // 'name/cos:DeleteBucketCORS',
// // // Lifecycle
// // 'name/cos:PutBucketLifecycle',
// // 'name/cos:GetBucketLifecycle',
// // 'name/cos:DeleteBucketLifecycle',
// // // Replication
// // 'name/cos:PutBucketReplication',
// // 'name/cos:GetBucketReplication',
// // 'name/cos:DeleteBucketReplication',
// // // 删除文件
// // 'name/cos:DeleteMultipleObject',
// // 'name/cos:DeleteObject',
// // 简单文件操作
// 'name/cos:PutObject',
// 'name/cos:PostObject',
// 'name/cos:AppendObject',
// 'name/cos:GetObject',
// 'name/cos:HeadObject',
// 'name/cos:OptionsObject',
// 'name/cos:PutObjectCopy',
// 'name/cos:PostObjectRestore',
// // 分片上传操作
// 'name/cos:InitiateMultipartUpload',
// 'name/cos:ListMultipartUploads',
// 'name/cos:ListParts',
// 'name/cos:UploadPart',
// 'name/cos:CompleteMultipartUpload',
// 'name/cos:AbortMultipartUpload',
// ),
// 'effect'=> 'allow',
// 'principal'=> array('qcs'=> array('*')),
// 'resource'=> array(
// 'qcs::cos:' . $this->config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/',
// 'qcs::cos:' . $this->config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/' . $this->config['AllowPrefix']
// )
// )
// )
// );// $policyStr = str_replace('\\/', '/', json_encode($policy));
// $Action = 'GetFederationToken';
// $Nonce = rand(10000, 20000);
// $Timestamp = time() - 1;
// $Method = 'GET';
// $params = array(
// 'Action'=> $Action,
// 'Nonce'=> $Nonce,
// 'Region'=> '',
// 'SecretId'=> $this->config['SecretId'],
// 'Timestamp'=> $Timestamp,
// 'durationSeconds'=> 7200,
// 'name'=> '',
// 'policy'=> $policyStr
// );// $params['Signature'] = urlencode(self::getSignature($params, $this->config['SecretKey'], $Method));
// $url = $this->config['Url'] . '?' . self::json2str($params, 1);
// $ch = curl_init($url);
// $this->config['Proxy'] && curl_setopt($ch, CURLOPT_PROXY, $this->config['Proxy']);
// curl_setopt($ch, CURLOPT_HEADER, 0);
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $result = curl_exec($ch);
// if(curl_errno($ch)) $result = curl_error($ch);
// curl_close($ch);
// $result = json_decode($result, 1);
// return $result['data'];
// }// public function getCosAuth()
// {// // 获取临时密钥,计算签名
// $tempKeys = self::getTempKeys();
// // 返回数据给前端
// header('Content-Type: application/json');
// header('Allow-Control-Allow-Origin: *'); // 这里修改允许跨域访问的网站
// header('Allow-Control-Allow-Headers: origin,accept,content-type');// echo json_encode($tempKeys);
// }
}
二、javascript上传图片部分
首先去腾旭云下载cos-js-sdk-v5.min.js并引入页面,这里只展示实现部分
// 图片上传监听事件
function uploadConver(_this,event) {for(var i = 0;i<event.target.files.length;i++) {var files = event.target.files[i];if (!files) {tipPopup('未选择上传文件',1100,4);return;}files && uploadFile(files, function (err, data) {if(data) {$("#preImg").html("").append('<img src="'+data.url+'" width="200px"/>');//$("#conver").val(data.url);console.log(data);}else {console.log(err);}//console.log(err || data);//document.getElementById('msg').innerText = err ? err : ('上传成功,ETag=' + data.ETag);});//uploadFileToOss(file);//console.log(file);}
}// 异步请求上传签名
var getAuthorization = function (options, callback) {var xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.onload = function (e) {var AuthData;try {AuthData = JSON.parse(xhr.responseText)} catch (e) {}if (AuthData && AuthData.Authorization) {callback(null, {Authorization: AuthData.Authorization,XCosSecurityToken: AuthData.XCosSecurityToken,});} else {// alert(123);console.error(AuthData);callback('获取签名出错');}};xhr.onerror = function (e) {callback('获取签名出错');};xhr.send();
};// 上传文件(真正上传到COS)
var uploadFile = function (file, callback) {if(file.size>1024*1024*2) { // 限制图片大小2Mlayer.open({content: '上传的图片不能超过 2MB',skin: 'msg',time: 3 });//tipPopup("上传的图片不能超过 2MB",1100,3);return;}if(file.type != 'image/jpeg' && file.type != 'image/png' && file.type != 'image/gif') { // 限制图片格式layer.open({content: '上传图片的格式不正确',skin: 'msg',time: 3 });//tipPopup("上传图片的格式不正确",1100,3);return;}// 检测文件名不能含有中文汉字if(escape(file.name).indexOf('%u') != -1) {layer.open({content: '上传的文件名有中文,请重新上传',skin: 'msg',time: 3 });return;}var dirBase = 'temp2018/';var myDate = new Date();var reg = new RegExp( '/' , "g" );// var specilReg = /[@#\$\!()%-~+\^&\s*]+/g;; // 过滤文件名的特殊字符// var fileName = file.name.replace(specilReg,'');var files = (myDate.toLocaleDateString()).replace(reg,"")+'/'+myDate.getTime()+'_'+parseInt(Math.random()*100000)+'_'+file.name;var Key = dirBase+ files; // 这里指定上传目录和文件名// 执行获取签名函数,拿到签名通过回调上传getAuthorization({Method: 'POST', Key: Key}, function (err, info) {var fd = new FormData();fd.append('key', Key);fd.append('Signature', info.Authorization);fd.append('Content-Type', '');info.XCosSecurityToken && fd.append('x-cos-security-token', info.XCosSecurityToken);fd.append('file', file);var url = prefix;var xhr = new XMLHttpRequest();xhr.open('POST', url, true);xhr.onload = function () {if (Math.floor(xhr.status / 100) === 2) {var ETag = xhr.getResponseHeader('etag');callback(null, {url: url+Key, ETag: ETag});}else {callback('文件 ' + Key + ' 上传失败,状态码:' + xhr.status);}};xhr.onerror = function () {callback('文件 ' + Key + ' 上传失败,请检查是否没配置 CORS 跨域规则');};$("#preImg").html("").append('<span style="color:red">上传中……</span>');xhr.send(fd);});
};
----------------------------------------------------------------------------------------------------------
三、微信小程序上传方式
这里小程序就演示直接自己生成签名,然后通过cos的SDK提供的函数上传。
1.config.js 单独配置
var config = {Bucket: 'busin-1256537792',//存储桶Region: 'ap-guangzhou',//地域SecretId: 'AKIDTtR************XiiW8nLLlp39yl4LW', SecretKey: 'hslO1YxFNJ5lGh0yR7c4Qemi8VhPRhmf', //replace with yours
}module.exports = config
2.实现上传功能
/*
*author: fuchao
*date: 2018-04-27
*desc: 小程序本地签名上传图片到腾讯云cos
*个人公众号: ZEROFC_DEV
**/// 同样需要先引入COS的SDK,和配置文件
var COS = require('../../lib/cos-wx-sdk-v5');
var config = require('./config');// 实例COS
var cos = new COS({getAuthorization: function (params, callback) { //获取签名var authorization = COS.getAuthorization({SecretId: config.SecretId,SecretKey: config.SecretKey,Method: params.Method,Key: params.Key});callback(authorization);}
});Page({data: {list: [],},simpleUpload: function() {// 选择文件wx.chooseImage({count: 4, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: function (res) {var filePath = res.tempFilePaths[0]var Key = filePath.substr(filePath.lastIndexOf('/') + 1); // 这里指定上传的文件名var dateObj = new Date();var timestamp = dateObj.getTime();var nowDate = dateObj.toLocaleDateString();var formatDate = nowDate.replace(/\//g,"-"); // 格式斜杠日期console.log(formatDate);var newKey = formatDate + '/' + timestamp+Key; // cos上定义目录var tempObj = {};tempObj.imgLocation = 'https://' + config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + newKey; // 返回上传的绝对URL// sdk提供的COS上传函数,如果想批量上传,在这里加FOR循环即可。cos.postObject({Bucket: config.Bucket, // 存储桶Region: config.Region, // 地域Key: newKey,FilePath: filePath, // 本地文件临时地址// onProgress: function (info) { // 上传时基本信息// console.log(JSON.stringify(info));// }},requestCallback(null,tempObj));}})},
});// 上传图片回调函数
var requestCallback = function (err, data) {console.log(err || data);if (err && err.error) {wx.showModal({ title: '返回错误', content: '请求失败:' + err.error.Message + ';状态码:' + err.statusCode, showCancel: false });} else if (err) {wx.showModal({ title: '请求出错', content: '请求出错:' + err + ';状态码:' + err.statusCode, showCancel: false });} else {console.log(data);wx.showToast({ title: '请求成功', icon: 'success', duration: 3000 });}
};
个人避坑解决方案
原因:开始上传图片到cos的项目我是用TP3.2做的,但是上传到linux且高版本的php服务器上,发现我那个生成签名的php竟然报500错误,而我本地是windows且php版本低于5.5一切都很正常。至于是什么原因,我也没时间去解决,只能把生成签名的php文件改成tp5.0的放在另一个项目中,而我就以跨域的方式去请求签名。
1.php文件修改
// 增加跨域响应头
header('Content-Type: application/json');
header('Allow-Control-Allow-Origin: *'); // 这里修改允许跨域访问的网站
header('Allow-Control-Allow-Headers: origin,accept,content-type');// 增加前端jsonp参数
$callback = input('callback') ? input('callback') : '';// 以回调函数返回签名到前端
echo $callback . '(' . json_encode($data) . ')';
2.js部分修改(主要改成跨域请求签名)
// 计算签名
var getAuthorization = function (options, callback) {var baseUrl = $("#cosurl").attr("urls");var url = baseUrl;$.ajax({ url:url, dataType: 'jsonp', //类型jsonp: "callback", // 参数 后台接受的是回掉函数名 //data:"", type:'get',success: function(result) {callback(null, {Authorization: result.Authorization, // 跨域拿到签名XCosSecurityToken: result.XCosSecurityToken,});}, error:function(result) { callback('获取签名出错');}})
};
个人微信公众号
微信小程序/网站 上传图片到腾讯云COS相关推荐
- 微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别——基于腾讯云开发者实验项目
微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别--基于腾讯云开发者实验项目 开通腾讯云相关权限(AI人脸识别,文字识别-身份证识别) 查看API密钥 部署微信小程序 成功演示 代码包 开通腾 ...
- 微信小程序开发系列——3. 腾讯云服务器配置
摘要:本文说明了在腾讯云服务器上通过"微信小程序专用解决方案"搭建.部署后端服务器及基础服务的过程. 了解了基本的开发工具以后,我们开始配置服务器相关的信息,要完成后端服务器的配置 ...
- 微信小程序 实现实时语音识别 腾讯云
目录 一.安装小程序插件 二.去腾讯云申请开通语音识别 三.实践 一.安装小程序插件 去微信公众平台 --设置--添加插件--搜索 wx3e17776051baf153 二.去腾讯云申请开通语音识别 ...
- 微信小程序(图像识别)腾讯云、百度智能云API(含源码)
前言 近期因为自己生活上的需要,开发了一款图像识别小程序.在开发初期,自己浏览参考了大量网上现成存在的小程序,根据体验功能的使用情况,基本都能达到其所述功能.但是有个问题是,很多小程序图像识别功能过于 ...
- 腾讯小程序服务器忙,使用腾讯云助手小程序管理腾讯云服务器
一般我们运维腾讯云服务器都是通过电脑端网页登录腾讯云后台进行管理维护,其实除了在电脑端管理腾讯云服务器等资源外,可以在手机微信端运维操作腾讯云服务器,简单方便,常用的腾讯云服务器关机.重启.续费.重置 ...
- 微信小程序接入第三方插件腾讯位置服务地图选点
微信小程序接入第三方插件腾讯位置服务地图选点 1.在小程序服务平台中添加"腾讯位置服务地图选点"插件 1.在小程序服务平台中添加"腾讯位置服务地图选点"插件 微 ...
- 微信小程序原生上传图片封装
资源参考 组件免费下载地址 概述 微信小程序原生上传图片功能封装,具体使用根据个人情况而定. 组件自定义属性与方法描述 isShow:布尔值,默认为true true:不显示上传图标 false:显示 ...
- 微信小程序video组件调用腾讯视频的解决方案
最近在开发中碰到了微信小程序video组件调用腾讯视频的问题,就趁机来总结一下. 对方只给了我一个腾讯视频的网页链接,然后需要放置到小程序里面,大概开发前景是这样的. 对方提供的视频链接: https ...
- 微信小程序实时定位(腾讯地图)
微信小程序实时获取地理位置-腾讯地图 微信小程序-获取当前城市位置: 一. 我用的腾讯定位服务 https://lbs.qq.com/ 打开之后点击控制台 2.我们创建自己的密匙key 3.下载微信小 ...
最新文章
- 关于 Delphi 中流的使用(2) 用 TFileStream(文件流) 读写
- Ubuntu下安装ulipad
- 深度学习核心技术精讲100篇(三)-层次自适应的多臂老虎机决策算法 ( HATCH )在滴滴中的应用
- JavaSE(二十三)——JVM
- Leetcode--49. 字母异味词分组
- 阿里开源首个深度学习框架 X-Deep Learning!
- 利用SQL和Python分别实现人流量查询,考验逻辑思维的时候到了
- servlet中文乱码_Servlet入门 信息过滤
- php如何请求api,PHP如何发送GET/POST请求调用API
- papers to read
- 51单片机——蓝牙远程点灯
- pvs、pvdisplay、pvscan 查看物理卷信息
- 如何在没有原工程的情况下,利用vivado将bit文件转化成bin文件
- csgo准星设置代码_csgo准星代码怎么输入
- python-回调函数
- 震惊!没想到你居然是这样的for循环(UC打钱!)
- JavaME证书的制作和介绍
- 述职答辩提问环节一般可以问些什么_什么是述职。述职会问些什么问题。
- iOS 获取手机步数
- DEM数据知识介绍-数字高程模型
热门文章
- caused by java.io.io_疑难杂症之 Error:java.io.InvalidClassException
- echarts 提示框被挡住如何解决
- 未来人类将被AI取代?一文读懂人工智能类型与发展阶段
- 好东西(Android开发人员不得不收集的代码)
- 小学计算机教研组总结,小学信息技术教研组工作总结范文
- Crash内核调试手段
- django + MySQL + flup + Nginx 的一些相关配置文件的备份
- 终端(terminal)打印彩色文字
- python无序序列_Python自动化Markdown无序列表
- GoDaddy SSL证书制作和安装