2015-12-31 13 views
8

Tôi đang cố gắng tải một trang web lên thùng S3 bằng cách sử dụng Boto3 SDK của Amazon cho Python.Cài đặt loại nội dung AWS trong S3 Sử dụng Boto3

Tôi gặp sự cố khi đặt Content-Type. AWS tiếp tục tạo ra một chìa khóa siêu dữ liệu mới cho Content-Type ngoài người tôi đang xác định sử dụng mã này:

# Upload a new file 
data = open('index.html', 'rb') 
x = s3.Bucket('website.com').put_object(Key='index.html', Body=data) 
x.put(Metadata={'Content-Type': 'text/html'}) 

Bất kỳ hướng dẫn làm thế nào để thiết lập Content-Type để text/html sẽ được đánh giá rất nhiều.

Trả lời

18

Content-Type không phải là tùy chỉnh siêu dữ liệu, đó là những gì Metadata được sử dụng cho. Nó có tài sản riêng của mình mà có thể được thiết lập như thế này:

bucket.put_object(Key='index.html', Body=data, ContentType='text/html') 

Lưu ý: .put_object() có thể thiết lập nhiều hơn chỉ Content-Type. Kiểm tra các Boto3 documentation cho phần còn lại.

+0

Cảm ơn! Tôi đã tìm ra rằng khoảng 10 phút trước khi bạn đăng nó! –

1

Ở đây, data là một tập tin mở ra, không phải nội dung:

# Upload a new file 
data = open('index.html', 'rb') 

Để đọc một (nhị phân) file:

import io 

with io.open("index.html", mode="rb") as fd: 
    data = fd.read() 

Nó sẽ được tốt hơn theo cách đó.

+1

Cảm ơn cho thông điệp của bạn. Tuy nhiên, nó vẫn đang tải lên dưới dạng "nhị phân/octet-stream". –

8

Bạn cũng có thể làm điều đó với các upload_file() phương pháp và ExtraArgs từ khóa (và thiết lập quyền truy cập vào thế giới đọc cũng):

import boto3 
s3 = boto3.resource('s3') 
s3.meta.client.upload_file('source_file_name.html', 'my.bucket.com', 'aws_file_name.html', ExtraArgs={'ContentType': "application/json", 'ACL': "public-read"}) 
+0

Câu trả lời sai, nó sẽ đặt 'x-amz-meta-contenttype' = 'application/json', không phải 'Content-Type' – doanduyhai

Các vấn đề liên quan