2014-02-15 65 views
7

如何通過Python boto模塊在啓用網站主機的S3帳戶中的文件上設置內容類型?無法在S3中設置文件內容類型

我做:

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 
from boto.cloudfront import CloudFrontConnection 

conn = S3Connection(access_key_id, secret_access_key) 
bucket = conn.create_bucket('mybucket') 
b = conn.get_bucket(bucket) 
b.set_acl('public-read') 

fn = 'index.html' 
template = '<html>blah</html>' 
k = Key(b) 
k.key = fn 
k.set_contents_from_string(template) 
k.set_acl('public-read') 
k.set_metadata('Content-Type', 'text/html') 

然而,當我訪問它從http://mybucket.s3-website-us-east-1.amazonaws.com/index.html我的瀏覽器會提示我要下載的文件,而不是簡單地服務於它作爲一個網頁。

查看S3管理控制檯中的元數據顯示Content-Type實際上已設置爲「application/octet-stream」。如果我在控制檯中手動更改它,我可以正常訪問頁面,但是如果我再次運行腳本,它會將其重置爲錯誤的內容類型。

我在做什麼錯?

+0

我並不完全確定,但如果我沒有記錯,您的操作的順序是顯着的。嘗試重新排序您的關鍵操作 - 例如,在設置內容之前設置「Content-Type」元數據。 – lanzz

回答

14

set_metadata方法真的是用於在S3對象上設置用戶元數據。許多標準的HTTP元數據字段具有第一類屬性來表示它們,例如, content_type。另外,您希望在將對象實際發送到S3之前設置元數據。像這樣的東西應該工作:

import boto 

conn = boto.connect_s3() 
bucket = conn.get_bucket('mybucket') # Assumes bucket already exists 
key = bucket.new_key('mykey') 
key.content_type = 'text/html' 
key.set_contents_from_string(mystring, policy='public-read') 

請注意,你可以在你寫的對象S3從而節省不必再拍API調用的時間設定罐頭ACL策略。

0

我無法獲得上述解決方案來實際保留我的元數據更改。

也許是因爲我正在使用一個文件,它正在使用mimetype重置內容類型?此外,我正在上傳m3u8和ts文件以進行HLS編碼,以便可能會受到干擾。

無論如何,這是我的工作。

import boto 
conn = boto.connect_s3() 
bucket = conn.get_bucket('mybucket') 
key_m3u8 = Key(bucket_handle) 
key_m3u8.key = s3folder+"/"+s3keyname 
key_m3u8.metadata = {"Content-Type":"application/x-mpegURL","Cache-Control":"public,max-age=8"}        
key_m3u8.set_contents_from_filename("path_to_my_file", policy="public-read") 
+0

什麼是'bucket_handle'? –

+0

它只是一個包含S3中存儲桶名稱的字符串 – carterh062

相關問題