如何上传文件到S3,而无需创建一个临时的本地文件(How to upload a file to S

2019-07-31 20:51发布

是否有上传这是动态生成到Amazon S3的情况下直接先创建一个本地文件,然后上传到S3服务器上的文件的任何可行的方法? 我使用Python。 谢谢

Answer 1:

下面是一个例子下载的图像(使用请求库),并上传到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)


Answer 2:

你可以使用BytesIO从Python标准库。

from io import BytesIO
bytesIO = BytesIO()
bytesIO.write('whee')
bytesIO.seek(0)
s3_file.set_contents_from_file(bytesIO)


Answer 3:

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

  • 发送文件
  • set_contents_from_file
  • set_contents_from_string
  • set_contents_from_stream

对于使用set_contents_from_string的例子,请参阅存储数据的博托文档,粘贴在这里为完整的部分:

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


Answer 4:

我假设你正在使用botobotoBucket.set_contents_from_file()将接受一个StringIO对象,你已经写了将数据写入到文件中的任何代码应该是很容易适应写入到StringIO对象。 或者,如果你生成一个字符串,你可以使用set_contents_from_string()



Answer 5:

def upload_to_s3(url, **kwargs):
    '''
    :param url: url of image which have to upload or resize to upload
    :return: url of image stored on aws s3 bucket
    '''

    r = requests.get(url)
    if r.status_code == 200:
        # credentials stored in settings AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
        conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, host=AWS_HOST)

        # Connect to bucket and create key
        b = conn.get_bucket(AWS_Bucket_Name)
        k = b.new_key("{folder_name}/{filename}".format(**kwargs))

        k.set_contents_from_string(r.content, replace=True,
                                   headers={'Content-Type': 'application/%s' % (FILE_FORMAT)},
                                   policy='authenticated-read',
                                   reduced_redundancy=True)

        # TODO Change AWS_EXPIRY
        return k.generate_url(expires_in=AWS_EXPIRY, force_http=True)


Answer 6:

您可以尝试使用smart_open ( https://pypi.org/project/smart_open/ )。 我用它正是为:直接在S3写入文件。



Answer 7:

我有我想作为存储在S3上一个JSON文件,而无需创建一个本地文件的字典对象。 下面的代码为我工作:

from smart_open import smart_open

with smart_open('s3://access-key:secret-key@bucket-name/file.json', 'wb') as fout:
    fout.write(json.dumps(dict_object).encode('utf8'))


Answer 8:

鉴于在休息加密现在是一个求之不得的数据标准,smart_open不支持此AFAIK



文章来源: How to upload a file to S3 without creating a temporary local file