Загрузить изображение в Blob, используя GAE + Django - PullRequest
0 голосов
/ 22 августа 2011

Я пишу приложение, используя GAE и Django, в котором я хочу дать пользователю возможность загружать его изображение.Кроме того, я хочу, чтобы это изображение было сохранено как blob в хранилище данных GAE.Я видел много примеров, но ничего конкретного для этого сценария.Хотя я чувствую, что это общая проблема.

Все, что я хочу, - это создать новый продукт, и этот новый продукт должен иметь изображение.

1-я попытка: Я попытался добавить атрибут изображения (db.BlobProperty ()) в модель продукта, и, очевидно, django не включает его в представленную форму.

2-я попытка: Я создалновая сущность с двумя атрибутами (продукт как db.ReferenceProperty () и изображение как db.BlobProperty ()).При этом я пытался работать параллельно с формой django, изменяя HTML-форму django (включая | input type = 'file' name = 'img' / |), ожидая, что я смогу взять изображение из объекта запроса, но у меня снова не получилось.

Это класс продукта:

class Product(db.Model):
    id = db.IntegerProperty()
    desc = db.StringProperty()
    prodCateg = db.ReferenceProperty(ProductCategory)
    price = db.FloatProperty()
    details = db.StringProperty()
    image = db.BlobProperty()

Это форма Django (HTML):

<form action="{%url admin.editProduct product.key.id%}" enctype="multipart/form-data" method="post">
<table>
{{form}}
<tr><td><input type="file" name="img" /></td></tr>
<tr><td><input type="submit" value="Create or Edit Product"></td></tr>
</table>
</form>

Это форма Django (python):

class ProductForm(djangoforms.ModelForm):
  class Meta:
    model = Product
    exclude = ['id']

Это обработчик запросов:

def editProduct(request, product_id):
  user = users.GetCurrentUser()
  #if user is None:
  #  return http.HttpResponseForbidden('You must be signed in to add or edit a gift')

  product = None
  if product_id:
    product = Product.get(db.Key.from_path(Product.kind(), int(product_id)))
    if product is None:
      return http.HttpResponseNotFound('No product exists with that key (%r)' %
                                       product)

  form = ProductForm(data=request.POST or None, instance=product)

  ##########################
  # Ambitious undertaking! #
  ##########################
  #if not product_id:
  #    uploadedImage = get("img")
  #    photo = Image()
  #    photo.product = product
  #    uploadedPhoto = request.FILES['img'].read()
  #    photo.image = db.Blob(uploadedPhoto)
  #    image.put()

  if not request.POST:
    return respond(request, user, 'addprod', {'form': form, 'product': product})

  errors = form.errors
  if not errors:
    try:
      product = form.save(commit=False)
    except ValueError, err:
      errors['__all__'] = unicode(err)
  if errors:
    return respond(request, user, 'addprod', {'form': form, 'product': product})

  product.put()

  return http.HttpResponseRedirect('/product')

Как вы можете видеть, обработчик запросов основан на Учебнике по подаркам от Google

Так что, если кто-то может поставить егоМнение я был бы очень благодарен!

Заранее спасибо!

1 Ответ

0 голосов
/ 25 августа 2011

Возможно, вы захотите взглянуть на пример, в котором используется API-интерфейс blobstore с blobstoreuploadhandler и / или отредактируйте обработчик запроса, чтобы сохранить загруженный файл как свойство blobreference или свойство blobreference в зависимости от того, используете ли вы API-интерфейс blobstoreили просто переменная blobproperty.Вы можете быть конкретны в отношении данных поста http, т. Е. `

self.request.post('img').file.read(). Я рекомендую выбрать API Blobstore и blobstoreuploadhandler, поскольку это автоматически сделает для вас очень хорошие вещи: 1. хранение типа MIM и 2.сохранение имени файла 3. включение обслуживания через get_serving_url, что имеет несколько преимуществ.

...