Как сохранить веб-изображения в интернет-магазине App Engine? - PullRequest
1 голос
/ 20 марта 2011

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

  1. HTML форма с текстовым полем для URL изображения.Это отправляет в ...
  2. A обработчик , который берет опубликованный 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

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

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Нельзя просто включить изображение в качестве полезной нагрузки HTTP-запроса blobstore и ожидать, что оно поймет, что с ним делать.Blobstore ожидает сообщение типа application/multipart-form-data, которое браузер предоставляет при загрузке в blobstore.Есть библиотека, которая делает это для вас здесь .

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

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

3 голосов
/ 21 марта 2011

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

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

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

Этот пост вы можете увидеть больше на store-images-in-datastore

...