Python腳本上傳文件到騰訊云COS對象存儲

環(huán)境 CentOS 7.4
Python 2.7.5

安裝準(zhǔn)備

安裝 pip

pip 是什么
The PyPA recommended tool for installing Python packages.
pip · PyPI
Installation - pip documentation v21.1.2 (pypa.io)

easy_install pip

使用命令python -m pip --version檢查pip是否被安裝 (上面的安裝沒生效啊)

[root@dns ~]# python -m pip --version
/usr/bin/python: No module named typing; 'pip' is a package and cannot be directly executed

使用get-pip.py安裝

#Python 3
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
#Python 2.7
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
#安裝pip
python get-pip.py
#升級pip
python -m pip install -U pip

安裝SDK

pip install -U cos-python-sdk-v5

提示如下報錯,參見Python 升級 requests 包失敗解決
ERROR: Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

Demo 程序

Demo 1: 顯示指定Region內(nèi)的存儲桶列表
# -*- coding=utf-8
# appid 已在配置中移除,請在參數(shù) Bucket 中帶上 appid。Bucket 由 BucketName-APPID 組成
# 1. 設(shè)置用戶配置, 包括 secretId,secretKey 以及 Region
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
secret_id = '你自己的secretId'      # 替換為用戶的 secretId
secret_key = '你自己的secretKey'      # 替換為用戶的 secretKey
region = 'ap-shanghai'     # 替換為用戶的 Region
token = None                # 使用臨時密鑰需要傳入 Token,默認(rèn)為空,可不填
scheme = 'https'            # 指定使用 http/https 協(xié)議來訪問 COS,默認(rèn)為 https,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
# 2. 獲取客戶端對象
client = CosS3Client(config)
# 參照下文的描述?;蛘邊⒄?Demo 程序,詳見 https://github.com/tencentyun/cos-python-sdk-v5/blob/master/qcloud_cos/demo.py


response = client.list_buckets(
)

print(response)

執(zhí)行結(jié)果

Demo 2: 顯示指定存儲桶內(nèi)的對象
# -*- coding=utf-8
# appid 已在配置中移除,請在參數(shù) Bucket 中帶上 appid。Bucket 由 BucketName-APPID 組成
# 1. 設(shè)置用戶配置, 包括 secretId,secretKey 以及 Region
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
secret_id = '你自己的secretId'      # 替換為用戶的 secretId
secret_key = '你自己的secretKey'      # 替換為用戶的 secretKey
region = 'ap-shanghai'     # 替換為用戶的 Region
token = None                # 使用臨時密鑰需要傳入 Token,默認(rèn)為空,可不填
scheme = 'https'            # 指定使用 http/https 協(xié)議來訪問 COS,默認(rèn)為 https,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
# 2. 獲取客戶端對象
client = CosS3Client(config)
# 參照下文的描述?;蛘邊⒄?Demo 程序,詳見 https://github.com/tencentyun/cos-python-sdk-v5/blob/master/qcloud_cos/demo.py


response = client.list_objects(
   Bucket='backup-1253280931'
)

print(response)

執(zhí)行結(jié)果

[root@bareos_server opt]# python cos_list_objects.py 
INFO:qcloud_cos.cos_client:list objects, url=:https://backup-1253280931.cos.ap-shanghai.myqcloud.com/ ,headers=:{}
{'Name': 'backup-1253280931', 'MaxKeys': '1000', 'Prefix': None, 'Marker': None, 'EncodingType': 'url', 'IsTruncated': 'false', 'Contents': [{'LastModified': '2021-05-26T03:06:30.000Z', 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'StorageClass': 'STANDARD', 'Key': 'DB_backup/', 'Owner': {'DisplayName': '1253280931', 'ID': '1253280931'}, 'Size': '0'}, {'LastModified': '2021-05-26T03:06:57.000Z', 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'StorageClass': 'STANDARD', 'Key': 'DB_backup/ecommerce_table_fwk_biz_log_backup/', 'Owner': {'DisplayName': '1253280931', 'ID': '1253280931'}, 'Size': '0'}]}

Demo 3: 顯示指定存儲桶內(nèi)的某個目錄的對象
# -*- coding=utf-8
# appid 已在配置中移除,請在參數(shù) Bucket 中帶上 appid。Bucket 由 BucketName-APPID 組成
# 1. 設(shè)置用戶配置, 包括 secretId,secretKey 以及 Region
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
secret_id = '你自己的secretId'      # 替換為用戶的 secretId
secret_key = '你自己的secretKey'      # 替換為用戶的 secretKey
region = 'ap-shanghai'     # 替換為用戶的 Region
token = None                # 使用臨時密鑰需要傳入 Token,默認(rèn)為空,可不填
scheme = 'https'            # 指定使用 http/https 協(xié)議來訪問 COS,默認(rèn)為 https,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
# 2. 獲取客戶端對象
client = CosS3Client(config)
# 參照下文的描述?;蛘邊⒄?Demo 程序,詳見 https://github.com/tencentyun/cos-python-sdk-v5/blob/master/qcloud_cos/demo.py


response = client.list_objects(
   Bucket='backup-1253280931',
   Prefix='DB_backup/ecommerce_table_fwk_biz_log_backup/'
)

print(response)

執(zhí)行結(jié)果

[root@bareos_server opt]# python cos_list_objects.py 
INFO:qcloud_cos.cos_client:list objects, url=:https://backup-1253280931.cos.ap-shanghai.myqcloud.com/ ,headers=:{}
{'Name': 'backup-1253280931', 'MaxKeys': '1000', 'Prefix': 'DB_backup/ecommerce_table_fwk_biz_log_backup/', 'Marker': None, 'EncodingType': 'url', 'IsTruncated': 'false', 'Contents': [{'LastModified': '2021-05-26T03:06:57.000Z', 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'StorageClass': 'STANDARD', 'Key': 'DB_backup/ecommerce_table_fwk_biz_log_backup/', 'Owner': {'DisplayName': '1253280931', 'ID': '1253280931'}, 'Size': '0'}, {'LastModified': '2021-05-26T03:13:18.000Z', 'ETag': '"7a544cfc6e98ddc019aa21e7413ee23b"', 'StorageClass': 'STANDARD', 'Key': 'DB_backup/ecommerce_table_fwk_biz_log_backup/ftptest.pcap', 'Owner': {'DisplayName': '1253280931', 'ID': '1253280931'}, 'Size': '3275'}]}
Demo 4: 上傳文件到指定桶的指定目錄下

# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError
from qcloud_cos import CosClientError
import sys
import logging

logging.basicConfig(level=logging.INFO, stream=sys.stdout)
#logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)

# 設(shè)置用戶屬性, 包括 secret_id, secret_key, region
# APPID 已在配置中移除,請在參數(shù) Bucket 中帶上 APPID。Bucket 由 BucketName-APPID 組成
secret_id = '我的ID'     # 替換為用戶的 secret_id
secret_key = '我的KEY'     # 替換為用戶的 secret_key
region = 'ap-shanghai'    # 替換為用戶的 region
token = None               # 使用臨時密鑰需要傳入 Token,默認(rèn)為空,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)  # 獲取配置對象
client = CosS3Client(config)

#上傳由 '/' 分隔的對象名,自動創(chuàng)建包含文件的文件夾。想要在此文件夾中添加新文件時,只需要在上傳文件至 COS 時,將 Key 填寫為此目錄前綴即可。
dir_name = 'DB_backup/ecommerce_table_fwk_biz_log_backup/'
file_name = 'fwk_biz_log_begin_to_20200101.xb'
object_key = dir_name + file_name
with open('/nfs_storage/fwk_biz_log_begin_to_20200101.xb', 'rb') as fp:
  response = client.put_object(
      Bucket='backup-1253280931',  # Bucket 由 BucketName-APPID 組成
      Body=fp,
      Key=object_key,
      EnableMD5=True,
      StorageClass='STANDARD',
      ContentType='text/html; charset=utf-8'
  )
  print(response['ETag'])

執(zhí)行結(jié)果: 提示>5G的文件不能上傳。小文件是可以的。

Traceback (most recent call last):
  File "cos_put_objects.py", line 43, in <module>
    ContentType='text/html; charset=utf-8'
  File "/usr/lib/python2.7/site-packages/qcloud_cos/cos_client.py", line 327, in put_object
    check_object_content_length(Body)
  File "/usr/lib/python2.7/site-packages/qcloud_cos/cos_comm.py", line 380, in check_object_content_length
    raise CosClientError('The object size you upload can not be larger than 5GB in put_object or upload_part')
qcloud_cos.cos_exception.CosClientError: The object size you upload can not be larger than 5GB in put_object or upload_part
Demo 5: 上傳>5G的文件到指定桶的指定目錄下

騰訊云-對象存儲-分塊上傳

簡單上傳的方式只支持最大5GB的文件上傳,而通過分塊上傳的方式可上傳大于5GB的文件。
這里使用 高級接口(推薦) -- 上傳對象(斷點續(xù)傳)
該高級接口根據(jù)用戶文件的長度自動選擇簡單上傳以及分塊上傳,對于小于等于20M的文件調(diào)用簡單上傳,對于大于20MB的文件調(diào)用分塊上傳,對于分塊上傳未完成的文件會自動進(jìn)行斷點續(xù)傳。
對于分塊上傳的文件,可以通過 progress_callback 回調(diào)函數(shù),獲取上傳進(jìn)度。

# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError
from qcloud_cos import CosClientError
import sys
import logging

logging.basicConfig(level=logging.INFO, stream=sys.stdout)
#logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)

# 設(shè)置用戶屬性, 包括 secret_id, secret_key, region
# APPID 已在配置中移除,請在參數(shù) Bucket 中帶上 APPID。Bucket 由 BucketName-APPID 組成
secret_id = '我的ID'     # 替換為用戶的 secret_id
secret_key = '我的KEY'     # 替換為用戶的 secret_key
region = 'ap-shanghai'    # 替換為用戶的 region
token = None               # 使用臨時密鑰需要傳入 Token,默認(rèn)為空,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)  # 獲取配置對象
client = CosS3Client(config)

#上傳由 '/' 分隔的對象名,自動創(chuàng)建包含文件的文件夾。想要在此文件夾中添加新文件時,只需要在上傳文件至 COS 時,將 Key 填寫為此目錄前綴即可。
dir_name = 'DB_backup/ecommerce_table_fwk_biz_log_backup/'
file_name = 'fwk_biz_log_begin_to_20200101.xb'
object_key = dir_name + file_name

def upload_percentage(consumed_bytes, total_bytes):
   """進(jìn)度條回調(diào)函數(shù),計算當(dāng)前上傳的百分比
    :param consumed_bytes: 已經(jīng)上傳的數(shù)據(jù)量
   :param total_bytes: 總數(shù)據(jù)量
   """
   if total_bytes:
       rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
       print('\r{0}% '.format(rate))
       sys.stdout.flush()

#with open('/nfs_storage/fwk_biz_log_begin_to_20200101.xb', 'rb') as fp:
response = client.upload_file(
    Bucket='backup-1253280931',  # Bucket 由 BucketName-APPID 組成
    Key=object_key,
    #LocalFilePath='/nfs_storage/fwk_biz_log_begin_to_20200101.xb',
    LocalFilePath='/nfs_storage/fwk_biz_log_begin_to_20200101.xb',
    #progress_callback=upload_percentage,   #暫時還不能使用,官方答復(fù)發(fā)布了文檔,代碼沒跟上
    #StorageClass='STANDARD'|'STANDARD_IA'|'ARCHIVE',
    EnableMD5=True
)
print(response['ETag'])

待有空,將文件改為參數(shù)傳入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容