我最近开始使用bottle和GAE blobstore,虽然我可以将文件上传到blobstore,但我似乎找不到从商店下载它们的方法。
我按照文档中的示例进行了操作,但仅在上传部分成功。我无法在我的应用程序中集成该示例,因为我使用的是webapp / 2中的其他框架。
我如何创建上传处理程序和下载处理程序,以便我可以获取上传的blob的密钥并将其存储在我的数据模型中,并在以后的下载处理程序中使用它?
我尝试使用BlobInfo.all()
在blobstore中创建查询,但我无法获取实体的密钥名称字段值。
这是我与blobstore的第一次互动,所以我不介意更好地解决问题的建议。
答案 0 :(得分:1)
为了服务blob,我建议你看看source code of the 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))
答案 1 :(得分:0)
对于下载,您只需生成一个响应,其中包含标题“X-AppEngine-BlobKey:[您的blob_key]”以及您需要的所有其他内容,如果需要,还可以使用Content-Disposition标头。或者如果它是一个图像你应该只使用服务API的高性能图像,生成一个网址并重定向到它....完成
用于上传,除了在上传安全地在blobstore(在文档中)之后编写一个appengine处理程序来调用
您需要一种方法来查找传入请求中的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
答案 2 :(得分:0)
对于将来寻找此答案的任何人来说,要做到这一点,你需要瓶子(d&#39;哦!)和defnull的multipart模块。
由于创建上传网址通常非常简单,并且根据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
很抱歉,如果代码中有任何错误,它就不在我的脑海中。