文章内容
2024/9/4 19:32:29,作 者: 黄兵
OpenStack Swift DLO 文件上传
下面这段代码使用的是 OpenStack Swift DLO (Dynamic Large Object) 方式上传:
def upload_object_by_chunk(self, container_name, object_name, file, chunk_index, total_chunks):
"""
上传分片到 OpenStack Swift
"""
url = f'{self._request_url}/v1/AUTH_{self._username}/{container_name}/{object_name}'
response = self._make_request('PUT', url, data=file.stream.read())
if response.status_code not in (200, 201):
raise ChunkUploadError(f"Failed to upload chunk {chunk_index}")
# 如果是最后一个分片,拼接文件
if int(chunk_index) + 1 == int(total_chunks):
manifest_url = f'{self._request_url}/v1/AUTH_{self._username}/{container_name}/{file.filename}'
manifest_headers = {
'X-Auth-Token': self._credentials,
'X-Object-Manifest': f'{container_name}/{file.filename}/'
}
manifest_response = self._make_request('PUT', manifest_url, headers=manifest_headers)
if manifest_response.status_code not in (200, 201):
raise FinalizeUploadError(f"Failed to finalize upload for {file.filename}")
return True关于 OpenStack Swift 大文件分片上传,分片上传(segmented upload)通常通过大对象支持(Large Object Support, LOS)机制实现。Swift 提供了两种处理大对象的方法:
静态大对象(SLO,Static Large Object): SLO 是通过一个清单(manifest)对象引用多个分片(segments)来组成大对象。清单文件本身是一个普通对象,包含了所有分片的引用。
动态大对象(DLO,Dynamic Large Object): DLO 使用前缀匹配来动态检索对象片段。DLO 的清单文件只是指向多个分片的前缀,而不是精确的列表。
上面的代码使用了 DLO 上传,主要原因为:
X-Object-Manifest 头来指向上传分片文件的前缀。DLO(动态大对象)方式通过将对象分片上传至同一个容器中的不同对象,然后通过上传一个“清单”文件(manifest file)来表示对象。这是 DLO 的工作机制。X-Object-Manifest 头的文件,用来告诉 Swift 该对象的所有分片都具有相同的前缀。DLO 会自动将这些分片组合为一个完整的大对象。DLO 的工作方式
- 分片文件会按照一定的命名规则上传(如
file_name/part_1,file_name/part_2等)。 - 最后一个请求会上传一个清单文件,并使用
X-Object-Manifest头来指定这些分片的路径前缀。 - Swift 在读取对象时,会动态地从这些分片中读取数据并组合成一个完整的对象。
相比之下,SLO (Static Large Object) 则是通过提前上传每一个分片,并在最后上传一个 JSON 清单文件,列出所有分片及其具体的路径和顺序。SLO 在创建对象时是静态的,不同于 DLO 动态组合分片的方式。
其它相关推荐:
1、OpenStack Swift 中 ACL 认证是由那个中间件实现的
评论列表