板 set_contents_from_file 来自现有板。s3.key.Key

boto set_contents_from_file from existing boto.s3.key.Key

我正在尝试做一些不可能的事情,但在文档中显然不是这样。本质上,我想使用 set_contents_from_file 方法使用不同的 s3.key.Key 设置 s3.key.Key 的内容。它报告以下错误:

 'Key' object has no attribute 'tell'

这是重现该问题的一些代码。

import boto
from boto.s3.key import Key
s3 = boto.connect_s3()
b = s3.get_bucket("XXXXXX")
ef = b.get_key("figures/test-figure.png") ## this file exists in b.


In [4]: ef.exists()
Out[4]: True


nk = Key(b, "my-new-key.png")
nk.set_contents_from_file(ef)


in set_contents_from_file(self, fp, headers, replace, cb, num_cb, policy, md5, reduced_redundancy, query_args, encrypt_key, size, rewind)
   1222             # programs remain that assume the older auto-rewind interface.
   1223             if not isinstance(fp, KeyFile):
-> 1224                 spos = fp.tell()
   1225                 fp.seek(0, os.SEEK_END)
   1226                 if fp.tell() == spos:

AttributeError: 'Key' object has no attribute 'tell'

我试过先调用:'ef.open_read()',但似乎并没有真正影响行为。我正在使用:

boto==2.38.0
botocore==1.2.0

S3 服务支持服务器端 COPY 操作,这似乎非常适合您的用例。这样的事情应该有效:

import boto
s3 = boto.connect_s3()
bucket = s3.get_bucket('my_bucket')
key = bucket.get_key('my_key_to_copy')
key.copy('my_bucket', 'my_new_key')

这将在存储桶中创建一个新对象,它是原始对象的副本,这一切都发生在服务器端。

试试这个方法:-

access_key, secret_key = your_access_key, yoursecret_key
conn = boto.connect_s3(access_key, secret_key)
bucket = conn.get_bucket(bucketname)
k = Key(bucket)
k.key = 'somekey'
k.set_contents_from_filename(file_path