#amazon-web-services #amazon-s3 #boto3 #aws-cli
#amazon-web-services #amazon-s3 #boto3 #aws-cli
Вопрос:
Мой вопрос возник, когда я столкнулся с двумя различными поведениями в URL объекта из файлов json, хранящихся в корзине s3.
Рассмотрим файл json: mydata.json
Если я загружу этот файл с помощью s3 dashboard с веб-сайта AWS, я смогу увидеть данные в браузере: //s3-us-west-2.amazonaws.com/bucket/folder/mydata.json. Я также могу прочитать эти данные из другого приложения, если создам определенную конфигурацию в корзине s3.
С другой стороны, если я использую boto3
библиотеку для python и загружаю тот же файл в ту же корзину (делая файл общедоступным в процессе), когда я нажимаю на URL объекта, он загружает файл, но не открывает данные в браузере.
Это код, который я использовал:
# upload json file
bucket.upload_file(path, jsonkey)
object_acl = s3.ObjectAcl('bucket_name', jsonkey)
bucket_response = object_acl.put(ACL='public-read')
Я исследовал свойства файла, такие как метаданные. Когда я загружаю файл через панель мониторинга, назначаются метаданные Content-Type: application/json
, а через boto3
— Content-Type: binary/octet-stream
. Я действительно не знаю, влияют ли метаданные на поведение URL объекта.
В этом контексте, как я могу правильно настроить файлы в формате json для загрузки или чтения? Я имею в виду, какова основная конфигурация, которая влияет на поведение URL объекта?
Я не смог найти существенной разницы между обоими методами (dashboard и boto3) в свойствах или разрешениях, помимо Content-Type
метаданных. Однако, когда я попытался изменить Content-Type
, поведение было таким же.
Любую другую информацию, которую я могу предоставить, чтобы прояснить этот вопрос, не стесняйтесь спрашивать. Заранее спасибо.
Ответ №1:
Документация для метода upload_file() ресурса S3 bucket не идеальна, поскольку она просто отсылает вас к эквивалентным документам S3Transfer о том, как можно использовать дополнительные аргументы.
Попробуйте следующее:
bucket.upload_file(path, jsonkey, ExtraArgs={'ContentType': "application/json"})
Комментарии:
1.Спасибо. Чего я не могу понять, так это почему у jsonfile нет опции
application/json
в метаданных, когда значение задаетсяbinary/octet-stream
через boto3. И когда я изменилapplication/json
URLbinary/octet-stream
объекта на, файл не загружался, он снова показывал данные в браузере.2. @jarmond С другой стороны, если целевой файл csv, какой тип содержимого нам нужно использовать для чтения данных, а не для их загрузки, text / csv?
3. Поведение отдельного браузера при отсутствии типа содержимого зависит от конкретной реализации afaik. Да, для содержимого CSV используйте text / csv.
4. @Ramiro Tormenta для меня то же самое. Я думаю, что после того, как boto3 однажды установил ContentType равным
binary/octet-stream
, файл не может измениться наapplication/json
, даже если вы укажете его с помощьюs3_client.put_object( Bucket=os.environ.get("BUCKET"), Key="data.json", Body=json.dumps(data, indent=4), ContentType="application/json" )
, это изменит метаданные (я проверяю на консоли s3), но не совсем. Моим решением было загрузить файл. удалите его из корзины, а затем добавьте снова с помощьюContentType="application/json"