使用 GAE 将图像上传到 Blob姜戈

发布于 2024-11-30 14:44:21 字数 2658 浏览 1 评论 0原文

我正在使用 GAE 和 Django 编写一个应用程序,我想在其中为用户提供上传图像的能力。另外,我希望将此图像作为 blob 存储在 GAE 的数据存储中。我见过很多例子,但没有具体针对这种情况。虽然,我觉得这是一个普遍的问题。

我想要的只是创造一个新产品,而这个新产品必须有一个形象。

第一次尝试:我尝试在产品模型中添加图像属性(db.BlobProperty()),显然 django 没有将其包含在所呈现的表单中。

第二次尝试:我创建了一个具有两个属性的新实体(产品为 db.ReferenceProperty(),图像为 db.BlobProperty())。有了这个,我尝试与 django 表单并行工作,修改 django HTML 表单(包括 |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 的 Gift-Tutorial

所以,如果有人可以提出他的意见我将非常感激!

先感谢您!

I'm writing an application using GAE and Django in which I want to give to user the ability to upload his image. Also, I want this image be stored as blob on GAE's datastore. I have seen many examples but nothing specific to this scenario. Although, I feel that is a common issue.

All I want, is to create a new product and this new product must have an image.

1st Attempt: I have tried to add an image attribute (db.BlobProperty()) in product's model, and obviously django does not include it on the presented form.

2nd Attempt: I have created a new entity with two attributes (product as db.ReferenceProperty() and image as db.BlobProperty()). With this I tried to work parallel with django form modifying the django HTML form (including an |input type='file' name='img' /|) expecting that I could take the image from the request object but I failed once more.

This is the Product Class:

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

This is the Django Form (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>

This is the Django Form (python):

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

This is the request handler:

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')

As you can see the request handler is based on the Google's Gift-Tutorial

So, If anyone could put his opinion I would be very thankful!

Thank you in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乖不如嘢 2024-12-07 14:44:21

您可能想查看使用 blobstore API 和 blobstoreuploadhandler 的示例 和/或编辑您的请求处理程序以将上传的文件存储为 blobproperty 或 blobreferenceproperty,具体取决于您使用 blobstore API 还是仅使用 blobproperty 变量。您可以具体了解http post数据,即`

self.request.post('img').file.read()
我确实建议您选择 blobstore API 和 blobstoreuploadhandler,因为这会自动为您做一些非常好的事情:1. 存储 MIM 类型和 2. 存储文件名 3. 通过 get_serving_url 启用服务,这有几个优点。

You may want to look at an example that uses the blobstore API with blobstoreuploadhandler and/or edit your request handler to store the uploaded file as a blobproperty or a blobreferenceproperty depending on if you use the blobstore API or just a blobproperty variable. You can be specific about http post data i.e. `

self.request.post('img').file.read()
I do recommend that you choose the blobstore API and blobstoreuploadhandler since that will do some very good things for you automatically: 1. storing MIM type and 2. storing filename 3. enabling serving via get_serving_url that has several advantages.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文