1-06 0 views
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author : Eric Winn # @Email : eng.eric.winn@gmail.com # @Time : 2020/1/6 1:17 AM # @Version : 1.0 # @File : put_file_2_oss # @Software : PyCharm import os import sys import oss2 from oss2 import SizedFileAdapter, determine_part_size from oss2.models import PartInfo access_key = '<YOUR ACCESS KEY>' access_secret = '<YOUR ACCESS SECRET KEY>' ALIYUN_OSS_ENDPOINT = '<YOUR BUCKET ENDPOINT>' ALIYUN_OSS_BUCKET = '<YOUR BUCKET NAME>' class OSS(object): def __init__(self): try: # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高 # 强烈建议您创建并使用RAM账号进行API访问或日常运维 # 请登录 https://ram.console.aliyun.com 创建RAM账号 self.auth = oss2.Auth(access_key, access_secret) # Endpoint请按实际情况填写 self.bucket = oss2.Bucket(self.auth, ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_BUCKET) except Exception as e: print(e) self.bucket = None def put_file(self, target, source): """ 上传小于5G的文件 :param target: OSS上目标位置 :param source: 源文件位置 :return: """ ret = self.bucket.put_object_from_file(target, source) return ret def multi_put_large_file(self, target, source): """ 上传大于5G的文件,分片上传 :param target: OSS上目标位置 :param source: 源文件位置 :return: """ total_size = os.path.getsize(source) # determine_part_size方法用来确定分片大小。 part_size = determine_part_size(total_size, preferred_size=100 * 1024) # 初始化分片。 # 如果需要在初始化分片时设置文件存储类型,请在init_multipart_upload中设置相关headers,参考如下 # headers = dict() # headers["x-oss-storage-class"] = "Standard" # upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id upload_id = self.bucket.init_multipart_upload(dir).upload_id parts = [] # 逐个上传分片。 with open(source, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置 result = self.bucket.upload_part(dir, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1 # 完成分片上传。 # 如果需要在完成分片上传时设置文件访问权限ACL,请在complete_multipart_upload函数中设置相关headers,参考如下 # headers = dict() # headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE # bucket.complete_multipart_upload(key, upload_id, parts, headers=headers) ret = self.bucket.complete_multipart_upload(target, upload_id, parts) return ret def resumable_put_large_file(self, target, source): """ 上传大于5G的文件,断点续传 :param target: OSS上目标位置 :param source: 源文件位置 :return: """ # 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。 ret = oss2.resumable_upload(self.bucket, target, source) return ret def get_file_url(self, file, expires=60): """ 获取文件URL,默认有URL有效期为60秒 :param file: OSS上文件路径 :param expires: URL有效期,默认为60秒 :return: """ url = self.bucket.sign_url('GET', file, expires, slash_safe=True) return url |
如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!
