curl -i -X PUT http://<host>:<port>
/v1/AUTH_test1/container/destination_obj
-H 'X-Auth-Token: <token>'
-H 'X-Copy-From: /container/source_obj'
-H 'X-Copy-From-Account: AUTH_test2'
-H 'Content-Length: 0'
这个工作正常。但是因为我已经使用了python-swiftclient library中的SwiftService类,但我能找到的最接近的是this commit on cross account upload。此外,它仅显示如何使用Connection
类而非SwiftService。
我在调用copy method和SwiftCopyObject内部时尝试覆盖os_storage_url
但都没有成功。
知道我必须在这做什么吗?
更新:
在copy
和upload
时,我试图通过覆盖HTTP标头来破解库。
通过将标题对象放入SwiftCopyObject
'header': ['Destination-Account:AUTH_name']
这会向example 2(The one with COPY method)
中的Swift Proxy API发送完全相同的HTTP请求这给了我404
,这与我手动将curl发送到API的结果相同。如果我们能够让它发挥作用,这可能是正确的方法。
以类似的方式,我在SwiftUploadObject
添加了标题,以指定在使用目标帐户的租户ID时从哪里复制。
SwiftUploadObject(source='/container/source_file.txt', object_name='file.txt', options={
'header': [
'X-Copy-From:/container/source_file.txt',
'X-Copy-From-Account:AUTH_source'
]})
这样做会让我找不到文件错误:FileNotFoundError: [Errno 2] No such file or directory: '/container/source_file.txt'
。这可能是因为它试图查看目标帐户而不是源。
我尝试将source
参数更改为None
。我收到Object upload verification failed: md5 mismatch
错误。但是,我可以看到文件现在完全位于目标容器中。 md5检查在失败时不会从目标容器中删除该文件。
虽然我可以利用这个黑客来完成这项工作,但我认为在生产中这样做是不明智的。