2013-02-21 2 views
0

Я спасаю файл изображения с сервером ведро в S3 следующим образом:Как сохранить JPG/PNG файлов и иметь его сохранить правильный Content-Type

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-адрес попал.

В любом случае я могу смягчить это?

+2

Я не знаком с этой библиотекой, которую вы используете, но когда вы загружаете файл на s3, вам нужно передать заголовок содержимого в вызове api. – datasage

ответ

3

Когда вы

jpg_data = response.read() 

Я считаю, что бото теряет информацию о расширении файла, который он использует, чтобы угадать MimeType. Так что к тому времени, когда вы храните его с

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) 

Вы можете управлять Content-Type, указав его Парам заголовка

Если вы хотите сохраните Content-Type с вашего оригинального get, вы можете сделать это:

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) 
Смежные вопросы