2013-06-19 6 views
2

У меня есть изображение, закодированное с базой 64, которую я хочу сохранить в моей модели хранилища данных.Как сохранить изображение base64 как файл в хранилище данных GAE

class Surveys(db.Model): 
    name = db.StringProperty(required = True) 
    text = db.TextProperty(required = True) 
    image = db.BlobProperty() 
    created = db.DateTimeProperty(auto_now_add = True) 

Как преобразовать строку base64 в файл, который я могу поместить в базу данных? Ниже я расскажу, как это сделать для обычного файла.

name = 'test' 
text = 'test' 
image = self.request.get('img') 
s = Surveys(name = name, text = text) 
s.image = db.Blob(image) 
s.put() 
+1

Я не уверен, что понял. У вас есть файл с кодировкой base64. И вы хотите сохранить его в двоичной форме (то есть: _unencoded_) в своем хранилище данных? –

+0

Да, я хочу, чтобы это снова был файл jpeg, который я могу отправить в хранилище данных –

ответ

4

Вы ищете способ декодирования данных base64?

Возможно, вы захотите взглянуть на различные base64 utilities, доступные с Python. Например, base64.b64decode:

import base64 

binary_data = base64.b64decode(base64_encoded_string) 

Предполагая, что файл JPEG был правильно закодирован как base64, это будет «обратным» операция - возвращает строку байт, идентичных содержание исходного файла. Вся информация о метафайлах файла теряется в процессе: вы возвращаете только содержимое файла. Не его оригинальное имя, разрешения и т. Д.

+0

. Это ли это снова превращает его в jpeg? –

+0

Спасибо! Я не знал, что он стал файлом, просто расшифровав его. Так много узнать :) –

1

Вы можете либо сохранить строку base64 непосредственно в хранилище данных, либо затем декодировать его во время выполнения, когда вам нужно отправить байты JPEG.

Или сделайте это наоборот ... Я бы предпочел сначала декодировать base64, прежде чем хранить в хранилище данных, поскольку он более эффективен в байтах, и вам нужно только один раз декодировать его.

И здесь вам не нужна концепция «файла» ... вы просто храните изображение в виде байтов, когда вам нужно отправить его в формате JPEG в браузер, вы просто создаете надлежащие заголовки HTTP (например, Content -Type: image/jpeg) и эхо/записать байты в теле http.

+0

Да! Это то, что я буду делать. Большое спасибо. –

1

Чтобы добавить ко всему остальному (что является хорошим советом): рассмотрите возможность использования ndb (новой базы данных), а не db для модели. Если вы выполняете get_by_id() для получения одного изображения, ndb будет обрабатывать memecache для вас. Это действительно ускорит вашу задержку для часто просматриваемых изображений. Кроме того, если это изображение с частой загрузкой, добавьте в свой заголовок ответа в поле управления кэшем дополнение к типу. НТН. -stevep

self.response.headers['Content-Type'] = 'image/jpeg' 
self.response.headers['Cache-Control'] = 'public, max-age=315360000' 
+0

Отличный вход! Спасибо, что прокомментировал Стив. –

Смежные вопросы