async def put_object_from_file(self, key, filename, headers=None, progress_callback=None): """上传一个本地文件到OSS的普通文件。 :param str key: 上传到OSS的文件名 :param str filename: 本地文件名,需要有可读权限 :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback` :return: :class:`PutObjectResult <oss2.models.PutObjectResult>` """ headers = utils.set_content_type(http.CaseInsensitiveDict(headers), filename) with open(to_unicode(filename), 'rb') as f: return await self.put_object(key, f, headers=headers, progress_callback=progress_callback)
async def upload_part_copy(self, source_bucket_name, source_key, byte_range, target_key, target_upload_id, target_part_number, headers=None): """分片拷贝。把一个已有文件的一部分或整体拷贝成目标文件的一个分片。 :param byte_range: 指定待拷贝内容在源文件里的范围。参见 :ref:`byte_range` :param headers: HTTP头部 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :return: :class:`PutObjectResult <oss2.models.PutObjectResult>` """ headers = http.CaseInsensitiveDict(headers) headers[ 'x-oss-copy-source'] = '/' + source_bucket_name + '/' + source_key range_string = _make_range_string(byte_range) if range_string: headers['x-oss-copy-source-range'] = range_string resp = await self.__do_object('PUT', target_key, params={ 'uploadId': target_upload_id, 'partNumber': str(target_part_number) }, headers=headers) return models.PutObjectResult(resp)
async def append_object(self, key, position, data, headers=None, progress_callback=None, init_crc=None): """追加上传一个文件。 :param str key: 新的文件名,或已经存在的可追加文件名 :param int position: 追加上传一个新的文件, `position` 设为0;追加一个已经存在的可追加文件, `position` 设为文件的当前长度。 `position` 可以从上次追加的结果 `AppendObjectResult.next_position` 中获得。 :param data: 用户数据 :type data: str、bytes、file-like object或可迭代对象 :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-开头的头部等 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback` :return: :class:`AppendObjectResult <oss2.models.AppendObjectResult>` :raises: 如果 `position` 和当前文件长度不一致,抛出 :class:`PositionNotEqualToLength <oss2.exceptions.PositionNotEqualToLength>` ; 如果当前文件不是可追加类型,抛出 :class:`ObjectNotAppendable <oss2.exceptions.ObjectNotAppendable>` ; 还会抛出其他一些异常 """ headers = utils.set_content_type(http.CaseInsensitiveDict(headers), key) if progress_callback: data = utils.make_progress_adapter(data, progress_callback) if self.enable_crc and init_crc is not None: data = utils.make_crc_adapter(data, init_crc) resp = await self.__do_object('POST', key, data=data, headers=headers, params={ 'append': '', 'position': str(position) }) result = models.AppendObjectResult(resp) if self.enable_crc and result.crc is not None and init_crc is not None: utils.check_crc('append', data.crc, result.crc) return result
async def get_object(self, key, byte_range=None, headers=None, progress_callback=None, process=None, params=None): """下载一个文件。 用法 :: >>> result = await bucket.get_object('readme.txt') >>> print(result.read()) 'hello world' :param key: 文件名 :param byte_range: 指定下载范围。参见 :ref:`byte_range` :param headers: HTTP头部 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback` :param process: oss文件处理,如图像服务等。指定后process,返回的内容为处理后的文件。 :return: file-like object :raises: 如果文件不存在,则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ;还可能抛出其他异常 """ headers = http.CaseInsensitiveDict(headers) range_string = _make_range_string(byte_range) if range_string: headers['range'] = range_string params = {} if params is None else params if process: params.update({Bucket.PROCESS: process}) resp = await self.__do_object('GET', key, headers=headers, params=params) return models.GetObjectResult(resp, progress_callback, self.enable_crc)
async def put_object(self, key, data, headers=None, progress_callback=None): """上传一个普通文件。 用法 :: >>> bucket.put_object('readme.txt', 'content of readme.txt') >>> with open(u'local_file.txt', 'rb') as f: >>> bucket.put_object('remote_file.txt', f) :param key: 上传到OSS的文件名 :param data: 待上传的内容。 :type data: bytes,str或file-like object :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :param progress_callback: 用户指定的进度回调函数。可以用来实现进度条等功能。参考 :ref:`progress_callback` 。 :return: :class:`PutObjectResult <oss2.models.PutObjectResult>` """ headers = utils.set_content_type(http.CaseInsensitiveDict(headers), key) if progress_callback: data = utils.make_progress_adapter(data, progress_callback) if self.enable_crc: data = utils.make_crc_adapter(data) resp = await self.__do_object('PUT', key, data=data, headers=headers) result = models.PutObjectResult(resp) if self.enable_crc and result.crc is not None: utils.check_crc('put object', data.crc, result.crc, result.request_id) return result
async def init_multipart_upload(self, key, headers=None): """初始化分片上传。 返回值中的 `upload_id` 以及Bucket名和Object名三元组唯一对应了此次分片上传事件。 :param str key: 待上传的文件名 :param headers: HTTP头部 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :return: :class:`InitMultipartUploadResult <oss2.models.InitMultipartUploadResult>` """ headers = utils.set_content_type(http.CaseInsensitiveDict(headers), key) resp = await self.__do_object('POST', key, params={'uploads': ''}, headers=headers) return await self._parse_result(resp, xml_utils.parse_init_multipart_upload, models.InitMultipartUploadResult)
async def copy_object(self, source_bucket_name, source_key, target_key, headers=None): """拷贝一个文件到当前Bucket。 :param str source_bucket_name: 源Bucket名 :param str source_key: 源文件名 :param str target_key: 目标文件名 :param headers: HTTP头部 :type headers: 可以是dict,建议是oss2.CaseInsensitiveDict :return: :class:`PutObjectResult <oss2.models.PutObjectResult>` """ headers = http.CaseInsensitiveDict(headers) headers[ 'x-oss-copy-source'] = '/' + source_bucket_name + '/' + urlquote( source_key, '') resp = await self.__do_object('PUT', target_key, headers=headers) return models.PutObjectResult(resp)