如何在不创建临时本地文件的情况下将文件上载到S3

sus*_*nne 25 python amazon amazon-s3

是否有任何可行的方法可以直接上传动态生成的文件到amazon s3而无需先创建本地文件然后上传到s3服务器?我用python.谢谢

Jim*_*Jty 23

下面是一个下载图像(使用请求库)并将其上传到s3的示例,无需写入本地文件:

import boto
from boto.s3.key import Key
import requests

#setup the bucket
c = boto.connect_s3(your_s3_key, your_s3_key_secret)
b = c.get_bucket(bucket, validate=False)

#download the file
url = "http://en.wikipedia.org/static/images/project-logos/enwiki.png"
r = requests.get(url)
if r.status_code == 200:
    #upload the file
    k = Key(b)
    k.key = "image1.png"
    k.content_type = r.headers['content-type']
    k.set_contents_from_string(r.content)
Run Code Online (Sandbox Code Playgroud)

  • @noahandthewhale您应该将此标记为答案,然后;) (4认同)

Roy*_*Han 15

您可以使用Python标准库中的BytesIO.

from io import BytesIO
bytesIO = BytesIO()
bytesIO.write('whee')
bytesIO.seek(0)
s3_file.set_contents_from_file(bytesIO)
Run Code Online (Sandbox Code Playgroud)

  • 或者,以bytesIO作为数据:s3.upload_fileobj(data,'','') (4认同)
  • 我一直在使用 s3.put_object(Body=bytesIO.getvalue(), Bucket='bucket', Key='key') 这对我来说非常有用。 (2认同)

jte*_*ace 11

博托库的主要对象有你可能会感兴趣的几种方法:

有关使用set_contents_from_string的示例,请参阅boto文档的存储数据部分,粘贴在此处是为了完整性:

>>> from boto.s3.key import Key
>>> k = Key(bucket)
>>> k.key = 'foobar'
>>> k.set_contents_from_string('This is a test of S3')
Run Code Online (Sandbox Code Playgroud)

  • 看到我有一个文件使用请求,如**file = request.file ['name']**然后我在本地保存**os.save(os.path.join(路径,文件))**,从那里我设置s3键和**set_contents_from_filename(os.path.join(路径,文件))**,我需要直接在s3上保存文件,而不是先在本地保存,然后在s3上保存... (2认同)

kin*_*all 2

我假设你正在使用boto. boto'sBucket.set_contents_from_file()将接受一个StringIO对象,并且您编写的用于将数据写入文件的任何代码都应该很容易适应写入对象StringIO。或者,如果您生成字符串,则可以使用set_contents_from_string().

  • 那是因为你传递的是一个字符串,而不是我建议的“StringIO”对象...... (2认同)