百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

微信小程序/网站 上传图片到腾讯云COS

toyiye 2024-08-22 22:54 4 浏览 0 评论

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 string
 public 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;
 // 判断是否修改了 AllowPrefix
 if ($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) {		// 限制图片大小2M
		layer.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, // 默认9
 sizeType: ['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('获取签名出错');
 }
 })
};

个人微信公众号

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码