1

我最近开始使用瓶子和 GAE blobstore,虽然我可以将文件上传到 blobstore,但我似乎找不到从商店下载它们的方法。

我按照文档中的示例进行操作,但仅在上传部分成功。我无法将示例集成到我的应用程序中,因为我使用的框架与 webapp/2 不同。

我将如何创建一个上传处理程序和下载处理程序,以便我可以获取上传的 blob 的密钥并将其存储在我的数据模型中并稍后在下载处理程序中使用它?

我尝试使用BlobInfo.all()来创建对 blobstore 的查询,但我无法获取实体的键名字段值。

这是我与 blobstore 的第一次互动,所以我不介意关于更好地解决问题的建议。

4

3 回答 3

1

对于提供 blob,我建议您查看BlobstoreDownloadHandler 的源代码。将其移植到瓶中应该很容易,因为该框架没有什么特别的。

这是一个关于如何使用的例子BlobInfo.all()

for info in blobstore.BlobInfo.all():
  self.response.out.write('Name:%s Key: %s Size:%s Creation:%s ContentType:%s<br>' % (info.filename, info.key(), info.size, info.creation, info.content_type))
于 2012-10-23T00:04:38.227 回答
0

对于下载,您只需要生成一个响应,其中包含标头“X-AppEngine-BlobKey:[your blob_key]”以及您需要的所有其他内容,例如 Content-Disposition 标头(如果需要)。或者如果它是一个图像,你可能应该只使用高性能图像服务 api,生成一个 url 并重定向到它....完成

对于上传,除了为 appengine 编写一个处理程序以在上传安全到 blobstore 后调用(在文档中)

您需要一种在传入请求中查找 blob 信息的方法。我不知道瓶子里的请求是什么样的。Blobstoreuploadhandler 有一个 get_uploads 方法,据我所知,它确实没有理由需要是一个实例方法。因此,这是一个需要 webob 请求的通用实现示例。对于瓶子,您需要编写与瓶子请求对象兼容的类似内容。

def get_uploads(request, field_name=None):
    """Get uploads for this request.
    Args:
      field_name: Only select uploads that were sent as a specific field.
      populate_post: Add the non blob fields to request.POST
    Returns:
      A list of BlobInfo records corresponding to each upload.
      Empty list if there are no blob-info records for field_name.

    stolen from the SDK since they only provide a way to get to this
    crap through their crappy webapp framework
    """
    if not getattr(request, "__uploads", None):
        request.__uploads = {}
        for key, value in request.params.items():
            if isinstance(value, cgi.FieldStorage):
                if 'blob-key' in value.type_options:
                    request.__uploads.setdefault(key, []).append(
                        blobstore.parse_blob_info(value))

    if field_name:
        try:
            return list(request.__uploads[field_name])
        except KeyError:
            return []
    else:
        results = []
        for uploads in request.__uploads.itervalues():
            results += uploads
        return results
于 2012-10-24T13:28:06.197 回答
0

对于将来寻找此答案的任何人,要做到这一点,您需要 bottle (d'oh!) 和 defnull 的multipart模块。

由于创建上传 URL 通常很简单,并且根据 GAE 文档,我将只介绍上传处理程序。

from bottle import request
from multipart import parse_options_header
from google.appengine.ext.blobstore import BlobInfo

def get_blob_info(field_name):
    try:
        field = request.files[field_name]
    except KeyError:
        # Maybe form isn't multipart or file wasn't uploaded, or some such error
        return None
    blob_data = parse_options_header(field.content_type)[1]
    try:
        return BlobInfo.get(blob_data['blob-key'])
    except KeyError:
        # Malformed request? Wrong field name?
        return None

抱歉,如果代码中有任何错误,那我就想不通了。

于 2014-08-19T20:33:03.877 回答