Как сохранить веб-изображения в хранилище больших двоичных объектов App Engine?

Я использовал этот вопрос в качестве шаблона для решения той же проблемы, но у меня возникают проблемы при публикации. У меня есть эти компоненты:

  1. HTML форма с текстовым полем для URL-адреса изображения. Это сообщение для...
  2. обработчик, который берет опубликованный URL-адрес, кодирует его и использует urlfetch для повторной отправки в...
  3. Отдельный обработчик загрузки файлов, который выполняет фактическое сохранение.

Компонент № 3 отлично работает сам по себе, если я использую ввод файла. Но я не совсем понимаю, как получить urlfetch то, что ему нужно, только из URL-адреса изображения. Мой процесс либо истекает, либо получает ответ 500 от финального обработчика.

# 1
class URLMainHandler(RequestHandler):
    def get(self):
        return render_response('blob/upload_url.html', 
                               upload_url=url_for('blobstore/upload/url'))
# 2        
class URLUploadHandler(RequestHandler):
    def post(self):
        import urllib
        # Get the posted image URL. 
        data = urllib.urlencode({'file': self.request.form.get('file')})
        # Post image to blobstore by calling POST on the file upload handler. 
        result = urlfetch.fetch(url=blobstore.create_upload_url(url_for('blobstore/upload')),
                                payload=data, 
                                method=urlfetch.POST)

        return self.redirect(url_for('blobstore/url'), result.status_code)

# 3
class UploadHandler(RequestHandler, BlobstoreUploadMixin):
    def post(self):
        # 'file' is the name of the file upload field in the form.
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]
        response = redirect_to('blobstore/serve', resource=blob_info.key())
        # Clear the response body.
        response.data = ''
        return response

Опять же, это процесс, которому я следую . Спасибо за вашу помощь!


person Matt Norris    schedule 20.03.2011    source источник
comment
У обработчика № 2 есть всего 30 секунд, чтобы получить файл и загрузить его в обработчик хранилища BLOB-объектов.   -  person systempuntoout    schedule 21.03.2011


Ответы (2)


Вы можете добиться того же, не используя blobstore api. Я думаю, вам нужно просто получить URL-адрес и получить контент, используя метод urlfetch().content, и сохранить его как свойство BLOB-объекта.

url = "imageurl"
result = urlfetch.fetch(url)
if result.status_code == 200:
   prof.avatar = db.Blob(result.content)

Дополнительные сведения о хранении и обслуживании изображений из хранилища данных в виде больших двоичных объектов.

Вы можете увидеть этот пост для получения дополнительной информации о store-images-in-datastore

person Abdul Kader    schedule 21.03.2011
comment
Спасибо - это намного проще. Я также нашел хороший ресурс для показа изображений: code.google.com/appengine. /статьи/питон/ - person Matt Norris; 23.03.2011

Вы не можете просто включить изображение в качестве полезной нагрузки HTTP-запроса хранилища больших двоичных объектов и ожидать, что он поймет, что с ним делать. Хранилище BLOB-объектов ожидает сообщение типа application/multipart-form-data, которое предоставляет браузер при загрузке в хранилище BLOB-объектов. Для этого есть библиотека здесь.

Будущий выпуск SDK будет включать возможность программно хранить большие двоичные объекты в хранилище BLOB-объектов, что избавит от необходимости использовать этот неприятный хак.

Однако, если ваши изображения имеют размер менее 1 МБ, гораздо более простым решением является сохранение изображения непосредственно в хранилище данных, как предлагает Абдул в своем ответе.

person Nick Johnson    schedule 22.03.2011
comment
Спасибо, Ник. Можно ли смешивать и сопоставлять Blobstore для обслуживания изображений после их загрузки, чтобы вам не приходилось создавать собственные обработчики для каждой модели? Здесь приведен пример > stackoverflow.com/questions/4763715/, но у меня это не сработало. В конце концов, у BlobProperty нет ключа. Есть ли в Blobstore функция, которая устранила бы этот пробел? - person Matt Norris; 23.03.2011
comment
@Wraith Нет, вы можете использовать хранилище BLOB-объектов только для обслуживания изображений, хранящихся в хранилище BLOB-объектов. Однако вы можете создать одну модель только для хранения изображений и использовать ReferenceProperty для ссылки на изображения из других моделей. - person Nick Johnson; 23.03.2011
comment
использовал предложенный хак. он дает ошибку этого короля.............. RequestTooLargeError: запрос к файлу вызова API. Append () был слишком большим. спасибо за сообщение, мы надеемся, что API-доступ к тому же будет доступен в ближайшее время ...... - person sandeep koduri; 13.08.2011
comment
@sandeep Вам нужно разбить запись на несколько частей - отдельные вызовы API не могут превышать 1 МБ. - person Nick Johnson; 14.08.2011