2014-02-15 3 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

나는 완전히 확신 할 수는 없지만 올바르게 회상하면 작업의 _order_가 중요합니다. 키 조작의 재정렬을 시도하십시오. 예를 들어 컨텐츠를 설정하기 전에'Content-Type' 메타 데이터를 설정하십시오. – lanzz

답변

14

set_metadata 메서드는 실제로 S3 개체에 대한 사용자 메타 데이터를 설정하기위한 것입니다. 많은 표준 HTTP 메타 데이터 필드에는이를 대표하는 1 차 클래스 속성이 있습니다. content_type. 또한 실제로 개체를 S3에 보내기 전에 메타 데이터를 설정하려고합니다. 이런 식으로 뭔가 작동합니다 : 당신은 당신이 다른 API 호출을 할 필요 절약 할 S3에 객체를 쓸 때 통조림 ACL 정책을 설정할 수 있습니다

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') 

참고.

0

실제로 메타 데이터 변경 사항을 유지하기 위해 위의 솔루션을 얻을 수 없었습니다.

아마 내가 파일을 사용하고 있었고 mimetype을 사용하여 콘텐츠 유형을 재설정했기 때문에? 또한 방해 할 수 있도록 HLS 인코딩을위한 m3u8 및 TS 파일을 업로드하고 있습니다.

어쨌든, 나에게 도움이 된 것은 다음과 같습니다.

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

관련 문제