腾讯云COS对象存储服务的使用
后端
安装
: pip install -U cos-python-sdk-v5
公共导入头
:
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
from django.conf import settings
from qcloud_cos.cos_exception import CosServiceError
# 正常情况日志级别使用INFO,需要定位时可以修改为DEBUG,此时SDK会打印和服务端的通信信息
# logging.basicConfig(level=logging.INFO, stream=sys.stdout)
创建桶
点击查看代码
def create_bucket(bucket, region="ap-chengdu"):
"""
创建桶
:param bucket: 桶名称 存储桶名称必须由数字、小写字母和 - 组成
:param region: 区域
:return:
"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
client.create_bucket(
Bucket=bucket,
ACL="public-read" # private / public-read / public-read-write
)
cors_config = {
'CORSRule': [
{
'AllowedOrigin': '*',
'AllowedMethod': ['GET', 'PUT', 'HEAD', 'POST', 'DELETE'],
'AllowedHeader': "*",
'ExposeHeader': "*",
'MaxAgeSeconds': 500
}
]
}
client.put_bucket_cors(
Bucket=bucket,
CORSConfiguration=cors_config
)
生成一个临时凭证,并给前端返回
点击查看代码
# 生成一个临时凭证,并给前端返回
# 1. 安装一个生成临时凭证python模块 pip install -U qcloud-python-sts
# 2. 写代码
from sts.sts import Sts
def credential(bucket, region):
"""生成一个临时凭证,并给前端返回"""
config = {
# 临时密钥有效时长,单位是秒(30分钟=1800秒)
'duration_seconds': 1800,
# 固定密钥 id
'secret_id': settings.TENCENT_COS_SECRETID,
# 固定密钥 key
'secret_key': settings.TENCENT_COS_SECRETKEY,
# 换成你的 bucket
'bucket': bucket,
# 换成 bucket 所在地区
'region': region,
# 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径
# 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
'allow_prefix': '*',
# 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
'allow_actions': [
# 'name/cos:PostObject',
# 'name/cos:DeleteObject',
# "name/cos:UploadPart",
# "name/cos:UploadPartCopy",
# "name/cos:CompleteMultipartUpload",
# "name/cos:AbortMultipartUpload",
"*",
],
}
sts = Sts(config)
result_dict = sts.get_credential()
return result_dict
上传文件
点击查看代码
def upload_file(bucket, region, file_obj, key):
"""上传文件"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
# 高级上传接口(推荐)
# 根据文件大小自动选择简单上传或分块上传,分块上传具备断点续传功能。
response = client.upload_file_from_buffer(
Bucket=bucket, # 得是已创建的bucket
Body=file_obj, # 文件对象
Key=key # 上传到桶之后的文件名(唯一)
)
# https://test-1313480500.cos.ap-chengdu.myqcloud.com/avatar.jpg
return 'https://{}.cos.{}.myqcloud.com/{}'.format(bucket, region, key)
删除文件
点击查看代码
def delete_file(bucket, region, key):
"""删除文件"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
# 高级上传接口(推荐)
# 根据文件大小自动选择简单上传或分块上传,分块上传具备断点续传功能。
client.delete_object(
Bucket=bucket, # 得是已创建的bucket
Key=key # 上传到桶之后的文件名(唯一)
)
批量删除文件
点击查看代码
def delete_file_list(bucket, region, key_list):
"""批量删除文件"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
"""
# 批量删除文件
objects = {
"Quiet": "true",
"Object": [
{
"Key": "file_name1"
},
{
"Key": "file_name2"
}
]
}
response = client.delete_objects(
Bucket='bucket',
Delete=objects
)
"""
objects = {
"Quiet": "true",
"Object": key_list,
}
# 高级上传接口(推荐)
# 根据文件大小自动选择简单上传或分块上传,分块上传具备断点续传功能。
client.delete_objects(
Bucket=bucket, # 得是已创建的bucket
Delete=objects # 上传到桶之后的文件名(唯一)
)
检查上传文件是否存在cos桶里
点击查看代码
def check_file(bucket, region, key):
"""检查上传文件是否存在cos桶里"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
# 高级上传接口(推荐)
# 根据文件大小自动选择简单上传或分块上传,分块上传具备断点续传功能。
data = client.head_object(
Bucket=bucket, # 得是已创建的bucket
Key=key # 上传到桶之后的文件名(唯一)
)
return data
删除桶
点击查看代码
def delete_bucket(bucket, region):
"""删除桶"""
config = CosConfig(Region=region, SecretId=settings.TENCENT_COS_SECRETID, SecretKey=settings.TENCENT_COS_SECRETKEY)
client = CosS3Client(config)
try:
# 找到文件 & 删除
while True:
part_objects = client.list_objects(bucket)
# 已经删除完毕,获取不到值
contents = part_objects.get('Contents')
if not contents:
break
# 批量删除
objects = {
"Quiet": "true",
"Object": [{'Key': item["Key"]} for item in contents]
}
client.delete_objects(bucket, objects)
# 没有截断说明文件为空与上面contents效果一样
if part_objects['IsTruncated'] == "false":
break
# 找到碎片 & 删除
while True:
part_uploads = client.list_multipart_uploads(bucket)
uploads = part_uploads.get('Upload')
if not uploads:
break
for item in uploads:
client.abort_multipart_upload(bucket, item['Key'], item['UploadId'])
if part_uploads['IsTruncated'] == "false":
break
client.delete_bucket(bucket)
except CosServiceError as e:
pass
前端
<view bindtap="uploadFile">上传到腾讯云对象存储</view>
微信小程序js代码
:
点击查看代码
/**
* 上传文件到腾讯云cos对象存储
*/
uploadFile:function(){
var onlineimgList = [];
// 获取后台传来的临时秘钥
var cos = new COS({
SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用putObject,sdk版本至少需要v1.3.0
// 必选参数
getAuthorization: function (options, callback) {
// 服务端 JS 和 PHP 示例:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
// 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
// STS 详细文档指引看:https://cloud.tencent.com/document/product/436/14048
wx.request({
url: 'http://127.0.0.1:8000/api/credential/',
data: {
// 可从 options 取需要的参数
},
success: function (result) {
var data = result.data;
var credentials = data && data.credentials;
if (!data || !credentials) return console.error('credentials invalid');
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
// v1.2.0之前版本的sdk使用XCosSecurityToken而不是SecurityToken
SecurityToken: credentials.sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
});
}
});
}
});
// 获取完临时秘钥开始上传
for(var index in this.data.imgList){
var filePath = this.data.imgList[index];
cos.uploadFile({
Bucket: 'wechat-xcx-1313480500', /* 填写自己的bucket,必须字段 */
Region: 'ap-chengdu', /* 存储桶所在地域,必须字段 */
Key: index + '-xx.png', /* 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)支持中文,必须字段 */
FilePath: filePath, /* 上传文件路径,必须字段 */
SliceSize: 1024 * 1024 * 5, /* 触发分块上传的阈值,超过5MB使用分块上传,小于5MB使用简单上传。可自行设置,非必须 */
onProgress: function(progressData) {
console.log("进度条--->",JSON.stringify(progressData));
}
}, function(err, data) {
if (err) {
console.log('上传失败', err);
} else {
console.log('上传成功');
onlineimgList.push(data.Location);
console.log(onlineimgList);
}
});
}
},