0

次の方法で、サーバーからの画像ファイルを S3 のバケットに保存しています。

request = urllib2.Request('http://link.to/file.jpg')
response = urllib2.urlopen(request)
jpg_data = response.read()

storage = S3BotoStorage(bucket='icanhazbukkit')
my_file = storage.open(path_to_new_file, 'w')
my_file.write(jpg_data)
my_file.close()

ファイルは書き込まれますが、途中で MIME コンテキストが失われ、保存された画像が返さContent-Type: binary/octet-streamれ、ブラウザは URL にヒットしたときに表示する代わりにダウンロードを試みます。

これを軽減する方法はありますか?

4

1 に答える 1

3

あなたがするとき

jpg_data = response.read()

boto は、MIME タイプを推測するために使用するファイル拡張子に関する情報を失っていると思います。だからあなたがそれを保管する時までに

my_file.write(jpg_data)

boto/S3 が知っているのは、書き込むバイナリ データがあるということだけです。

プログラムでこれらの行を置き換えると、次のようになります。

storage = S3BotoStorage(bucket='icanhazbukkit')
my_file = storage.open(path_to_new_file, 'w')
my_file.write(jpg_data)
my_file.close()

bucket = conn.create_bucket('icanhazbukkit')
k = Key(bucket)
k.name = "yourfilename"
header = {'Content-Type' : 'image/jpeg'}
k.set_contents_from_string(jpg_data, header)

header パラメータで指定することにより、Content-Type を制御できます。

元の get の Content-Type を保持したい場合は、次のようにします。

request = urllib2.Request('http://link.to/file.jpg')
response = urllib2.urlopen(request)
file_data = response.read()

bucket = conn.create_bucket('icanhazbukkit')
k = Key(bucket)
k.name = "yourfilename"
origType = response.info().gettype()
header = {'Content-Type' : origType}
k.set_contents_from_string(file_data, header)
于 2013-03-10T08:35:12.050 に答える