Загрузить большой файл из S3, используя API-шлюз? - PullRequest
0 голосов
/ 25 февраля 2019

Я создаю веб-страницу, где пользователи могут переходить по разным ссылкам, которые будут загружать файлы размером от 1 до 300+ мегабайт.Ссылки выполняют запрос GET к конечной точке шлюза API, которая загружает соответствующий файл из S3.В настоящее время я использую следующий код:

def files_download(event, context):
try:
    key = event['queryStringParameters']['key']
    # name = event
except Exception as e:
    return client_failure('Key field required as query parameter', e)

try:
    file = s3.Object('XXXXX', key)

    return success_file('text/csv', key, file.get()['Body'].read())
except Exception as e:
    return server_failure('Failed to retrieve file', e)

def success_file(content_type, attachment_name, data):
    return {
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True,
            'Content-Disposition': 'attachment; filename=' + attachment_name
        },
        'body': data
    }

def success(data):
    return {
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'data': data
        }, cls=DecimalEncoder)
    }

def server_failure(message, details):
    return {
        'isBase64Encoded': False,
        'statusCode': 500,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'message': message,
            'details': str(details)
        }, cls=DecimalEncoder)
    }

def client_failure(message, details):
    return {
        'isBase64Encoded': False,
        'statusCode': 400,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'message': message,
            'details': str(details)
        }, cls=DecimalEncoder)
    }

Тем не менее, это похоже на ошибку для больших файлов (> 100 МБ).Есть ли способ заставить его работать, или есть лучший способ позволить пользователям загружать файлы?Я думал о том, чтобы сделать свою корзину S3 общедоступной и предоставить прямые ссылки, но, очевидно, это не идеально для аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...