В корзине S3 как правильно настроить файлы в формате json для загрузки или чтения?

#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 URL binary/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"