Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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)
Esempio n. 5
0
    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
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)