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)
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)
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)
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)
def _param_to_quoted_query(k, v): if v: return urlquote(k, '') + '=' + urlquote(v, '') else: return urlquote(k, '')