Загрузка файла статического сайта AWS через boto 3, установка правильных типов контента - PullRequest
0 голосов
/ 28 апреля 2018

Каковы подходящие типы контента для различных типов файлов статического сайта, размещенного на AWS и , как их настроить с помощью boto3?

Я использую метод upload_file :

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('allecijfers.nl')
bucket.upload_file('C:/Hugo/Sites/allecijfers/public/test/index.html', 'test/index.html', ExtraArgs={'ACL': 'public-read', 'ContentType': 'text/html'})

Это хорошо работает для HTML-файлов. Первоначально я исключил ExtraArgs, что приводит к загрузке файла (возможно, потому что тип содержимого является двоичным?). Я нашел эту страницу , в которой указано несколько типов контента, но я не уверен, как ее применить.

например. вероятно, файлы CSS должны быть загружены с помощью ContentType: text / css. Но как насчет файлов js, index.xml и т. Д.? И как это сделать умным способом? К вашему сведению, это мой текущий скрипт для загрузки из Windows в AWS, для этого требуется string.replace ("\", "/"), который, вероятно, тоже не самый умный?

for root, dirs, files in os.walk(local_root + local_dir):
    for filename in files:
        # construct the full local path
        local_path = os.path.join(root, filename).replace("\\","/")
        # construct the full S3 path
        relative_path = os.path.relpath(local_path, local_root)
        s3_path = os.path.join(relative_path).replace("\\","/")
        bucket.upload_file(local_path, s3_path, ExtraArgs={'ACL': 'public-read', 'ContentType': 'text/html'})

Я загрузил свой полный сайт Hugo из того же источника с помощью интерфейса командной строки AWS в ту же корзину S3, и это прекрасно работает без указания типов контента, это также возможно через boto 3?

Большое спасибо заранее за вашу помощь!

1 Ответ

0 голосов
/ 28 апреля 2018

Существует встроенная библиотека python для угадывания mimetypes.

Так что вы можете сначала найти каждое имя файла. Это работает так:

import mimetypes
print(mimetypes.guess_type('filename.html'))

Результат:

('text/html', None)

В вашем коде. Я также немного улучшил переносимость вашего кода относительно пути Windows. Теперь он будет делать то же самое, но будет переносимым на платформу Unix путем поиска разделителя для конкретной платформы (os.path.sep), который будет использоваться в любых путях.

import boto3
import mimetypes

s3 = boto3.resource('s3')
bucket = s3.Bucket('allecijfers.nl')

for root, dirs, files in os.walk(local_root + local_dir):
    for filename in files:
        # construct the full local path (Not sure why you were converting to a
        # unix path when you'd want this correctly as a windows path
        local_path = os.path.join(root, filename)

        # construct the full S3 path
        relative_path = os.path.relpath(local_path, local_root)
        s3_path = relative_path.replace(os.path.sep,"/")
        # Get content type guess
        content_type = mimetypes.guess_type(filename)[0]
        bucket.upload_file(
            local_path,
            s3_path,
            ExtraArgs={'ACL': 'public-read', 'ContentType': content_type}
        )
...