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

时间:2012-09-24 18:09:13

标签: python amazon-s3 amazon

有没有可行的方法将动态生成的文件直接上传到amazon s3而无需先创建本地文件然后上传到s3服务器?我用python。感谢

10 个答案:

答案 0 :(得分:21)

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

scipy.optimize.newton

答案 1 :(得分:12)

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

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

答案 2 :(得分:10)

boto库的Key对象有几种您可能感兴趣的方法:

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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)

答案 5 :(得分:0)

您可以尝试使用smart_openhttps://pypi.org/project/smart_open/)。我正好用它:直接在S3中写入文件。

答案 6 :(得分:0)

我有一个dict对象,我想将其作为json文件存储在S3上,而不创建本地文件。以下代码对我有用:

@http.route('/rounds/details', type='http', auth="public", website=True)
def pos_details_json(self):
    rounds = http.request.env['sale.order.line'].search([])
    my_list = []
    for data in rounds:
        my_list.append({'Line Name': data.item.name})

    return json.dumps(my_list)

答案 7 :(得分:0)

鉴于静态加密现在是非常需要的数据标准,因此smart_open不支持此afaik

答案 8 :(得分:0)

我有一个类似的问题,想知道是否有最终答案,因为使用下面的代码,“ starwars.json”继续保存在本地,但是我只想将每个循环的.json文件推送到S3中,没有本地存储文件。

for key, value in star_wars_actors.items():

response = requests.get('http:starwarsapi/' + value)



data = response.json()


with open("starwars.json", "w+") as d:
    json.dump(data, d, ensure_ascii=False, indent=4)



s3.upload_file('starwars.json', 'test-bucket',
               '%s/%s' % ('test', str(key) + '.json'))

答案 9 :(得分:-1)

更新boto3:

aws_session = boto3.Session('my_access_key_id', 'my_secret_access_key')
s3 = aws_session.resource('s3')
s3.Bucket('my_bucket').put_object(Key='file_name.txt', Body=my_file)