def test_upload_large_with_tagging(self):

        from oss2.compat import urlquote

        key = random_string(16)
        content = random_bytes(5 * 100 * 1024)

        pathname = self._prepare_temp_file(content)

        headers = dict()
        tagging_header = oss2.headers.OSS_OBJECT_TAGGING

        key1 = 128 * 'a'
        value1 = 256 * 'b'

        key2 = '+-:/'
        value2 = ':+:'

        key3 = '中文'
        value3 = '++中文++'

        tag_str = key1 + '=' + value1
        tag_str += '&' + urlquote(key2) + '=' + urlquote(value2)
        tag_str += '&' + urlquote(key3) + '=' + urlquote(value3)

        headers[tagging_header] = tag_str

        result = oss2.resumable_upload(self.bucket,
                                       key,
                                       pathname,
                                       multipart_threshold=200 * 1024,
                                       num_threads=3,
                                       headers=headers)

        self.assertTrue(result is not None)
        self.assertTrue(result.etag is not None)
        self.assertTrue(result.request_id is not None)

        result = self.bucket.get_object(key)
        self.assertEqual(content, result.read())
        self.assertEqual(result.headers['x-oss-object-type'], 'Multipart')

        result = self.bucket.get_object_tagging(key)

        self.assertEqual(3, result.tag_set.len())
        tagging_rule = result.tag_set.tagging_rule
        self.assertEqual(256 * 'b', tagging_rule[128 * 'a'])
        self.assertEqual(':+:', tagging_rule['+-:/'])
        self.assertEqual('++中文++', tagging_rule['中文'])

        self.bucket.delete_object_tagging(key)

        result = self.bucket.get_object_tagging(key)

        self.assertEqual(0, result.tag_set.len())
        self.bucket.delete_object(key)
    def test_multipart_with_object_tagging(self):

        key = self.random_key()
        content = random_bytes(128 * 1024)

        tag_str = ''

        tag_key1 = urlquote('+:/')
        tag_value1 = urlquote('.-')
        tag_str = tag_key1 + '=' + tag_value1

        tag_ke2 = urlquote(' + ')
        tag_value2 = urlquote(u'中文'.encode('UTF-8'))
        tag_str += '&' + tag_ke2 + '=' + tag_value2

        headers = dict()
        headers[OSS_OBJECT_TAGGING] = tag_str

        parts = []
        upload_id = self.bucket.init_multipart_upload(
            key, headers=headers).upload_id

        headers = {'Content-Md5': oss2.utils.content_md5(content)}

        result = self.bucket.upload_part(key,
                                         upload_id,
                                         1,
                                         content,
                                         headers=headers)
        parts.append(
            oss2.models.PartInfo(1,
                                 result.etag,
                                 size=len(content),
                                 part_crc=result.crc))
        self.assertTrue(result.crc is not None)

        complete_result = self.bucket.complete_multipart_upload(
            key, upload_id, parts)

        object_crc = calc_obj_crc_from_parts(parts)
        self.assertTrue(complete_result.crc is not None)
        self.assertEqual(object_crc, result.crc)

        result = self.bucket.get_object(key)
        self.assertEqual(content, result.read())

        result = self.bucket.get_object_tagging(key)

        self.assertEqual(2, result.tag_set.len())
        self.assertEqual('.-', result.tag_set.tagging_rule['+:/'])
        self.assertEqual('中文', result.tag_set.tagging_rule[' + '])

        result = self.bucket.delete_object_tagging(key)
示例#3
0
    async def put_symlink(self, target_key, symlink_key, headers=None):
        """创建Symlink。

        :param str target_key: 目标文件,目标文件不能为符号连接
        :param str symlink_key: 符号连接类文件,其实质是一个特殊的文件,数据指向目标文件

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        """
        headers = headers or {}
        headers['x-oss-symlink-target'] = urlquote(target_key, '')
        resp = await self.__do_object('PUT',
                                      symlink_key,
                                      headers=headers,
                                      params={Bucket.SYMLINK: ''})
        return models.RequestResult(resp)
示例#4
0
    def __call__(self, bucket_name, key):
        self.type = _determine_endpoint_type(self.netloc, self.is_cname,
                                             bucket_name)

        key = urlquote(key, '')

        if self.type == _ENDPOINT_TYPE_CNAME:
            return '{0}://{1}/{2}'.format(self.scheme, self.netloc, key)

        if self.type == _ENDPOINT_TYPE_IP:
            if bucket_name:
                return '{0}://{1}/{2}/{3}'.format(self.scheme, self.netloc,
                                                  bucket_name, key)
            else:
                return '{0}://{1}/{2}'.format(self.scheme, self.netloc, key)

        if not bucket_name:
            assert not key
            return '{0}://{1}'.format(self.scheme, self.netloc)

        return '{0}://{1}.{2}/{3}'.format(self.scheme, bucket_name,
                                          self.netloc, key)
示例#5
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)
示例#6
0
def _param_to_quoted_query(k, v):
    if v:
        return urlquote(k, '') + '=' + urlquote(v, '')
    else:
        return urlquote(k, '')