栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将文件从s3存储桶下载到USERS计算机

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将文件从s3存储桶下载到USERS计算机

您无需将文件保存到服务器。您可以将文件下载到内存中,然后构建一个

Response
包含该文件的对象。

from flask import Flask, Responsefrom boto3 import clientapp = Flask(__name__)def get_client():    return client(        's3',        'us-east-1',        aws_access_key_id='id',        aws_secret_access_key='key'    )@app.route('/blah', methods=['GET'])def index():    s3 = get_client()    file = s3.get_object(Bucket='blah-test1', Key='blah.txt')    return Response(        file['Body'].read(),        mimetype='text/plain',        headers={"Content-Disposition": "attachment;filename=test.txt"}    )app.run(debug=True, port=8800)

小文件也可以,对于用户来说,没有任何有意义的等待时间。但是,对于较大的文件,这会严重影响UX。该文件将需要完全下载到服务器,然后再下载给用户。因此,要解决此问题,请使用方法的

Range
关键字参数
get_object

from flask import Flask, Responsefrom boto3 import clientapp = Flask(__name__)def get_client():    return client(        's3',        'us-east-1',        aws_access_key_id='id',        aws_secret_access_key='key'    )def get_total_bytes(s3):    result = s3.list_objects(Bucket='blah-test1')    for item in result['Contents']:        if item['Key'] == 'blah.txt': return item['Size']def get_object(s3, total_bytes):    if total_bytes > 1000000:        return get_object_range(s3, total_bytes)    return s3.get_object(Bucket='blah-test1', Key='blah.txt')['Body'].read()def get_object_range(s3, total_bytes):    offset = 0    while total_bytes > 0:        end = offset + 999999 if total_bytes > 1000000 else ""        total_bytes -= 1000000        byte_range = 'bytes={offset}-{end}'.format(offset=offset, end=end)        offset = end + 1 if not isinstance(end, str) else None        yield s3.get_object(Bucket='blah-test1', Key='blah.txt', Range=byte_range)['Body'].read()@app.route('/blah', methods=['GET'])def index():    s3 = get_client()    total_bytes = get_total_bytes(s3)    return Response(        get_object(s3, total_bytes),        mimetype='text/plain',        headers={"Content-Disposition": "attachment;filename=test.txt"}    )app.run(debug=True, port=8800)

这将以1MB的块下载文件,并在下载文件时将其发送给用户。这两个

.txt
文件均已通过40MB文件进行了测试。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/419905.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号