Как сделать ссылку на скачивание файла S3 - PullRequest
0 голосов
/ 17 января 2019

Я хочу сделать линк для загрузки сохраненного файла S3.

<a href="https://s3.region.amazonaws.com/bucket/file.txt" download>DownLoad</a> он отображает только file.txt в браузере. Так что я нашел способ скачать. Это добавить Content-Disposition : attachment метатег в файл.

Но мне нужно автоматически добавить этот метатег в новый файл. Итак, я сделал lambda function с помощью Python.

import json
import urllib.parse
import boto3

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        print("CONTENT TYPE: " + response['ContentType'])

    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

    try:
        s3_2 = boto3.resource('s3')
        s3_object = s3_2.Object(bucket, key)
        print(s3_object.metadata)
        s3_object.metadata.update({'ContentDisposition':'attachment'})

        print(bucket, key)

        s3_object.copy_from(CopySource={'Bucket':bucket, 'Key':key}, Metadata=s3_object.metadata, MetadataDirective='REPLACE')

    except:
        print(s3_object.metadata)

    return response['ContentType']

Но эта функция добавляет user defined metatag, а не system metatag. , ,

Что мне делать?

1 Ответ

0 голосов
/ 17 января 2019

Content-Disposition рассматривается S3 как (в некоторой степени) больше похожий на системные метаданные, чем на пользовательские / определяемые пользователем метаданные, поэтому у него есть собственный аргумент.

s3_object.copy_from(CopySource={'Bucket':bucket, 'Key':key}, ContentDisposition='attachment',  Metadata=s3_object.metadata, MetadataDirective='REPLACE')

Обратите внимание, что вам все еще нужны Metadata и MetadataDirective, как показано, чтобы это работало, но s3_object.metadata.update() не требуется, поскольку вы не изменяете пользовательские метаданные.

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