我的问题围绕着用户将文本文件上传到我的应用程序。在将其保存到数据存储区之前,我需要获取此文件并使用我的应用程序对其进行处理。从我读过的一点点来看,我了解到用户上传的内容作为 blob 直接进入数据存储区,如果我可以获取该文件,对其执行操作(意味着更改内部数据)然后将其重新写回数据存储。所有这些操作都需要由应用程序完成。不幸的是,从数据存储区文档中,http://code.google.com/appengine/docs/python/blobstore/overview.html 应用程序无法直接在数据存储区中创建 blob。这是我的主要头痛。我只需要一种从我的应用程序在数据存储中创建新 blob/文件的方法,而无需任何用户上传交互。
问问题
2277 次
2 回答
2
谢谢你的帮助。经过许多不眠之夜、3 部 App Engine 书籍和大量谷歌搜索,我找到了答案。这是代码(应该很容易解释):
from __future__ import with_statement
from google.appengine.api import files
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write('Hello WOrld')
form=''' <form action="/" method="POST" enctype="multipart/form-data">
Upload File:<input type="file" name="file"><br/>
<input type="submit"></form>'''
self.response.out.write(form)
blob_key="w0MC_7MnZ6DyZFvGjgdgrg=="
blob_info=blobstore.BlobInfo.get(blob_key)
start=0
end=blobstore.MAX_BLOB_FETCH_SIZE-1
read_content=blobstore.fetch_data(blob_key, start, end)
self.response.out.write(read_content)
def post(self):
self.response.out.write('Posting...')
content=self.request.get('file')
#self.response.out.write(content)
#print content
file_name=files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
f.write(content)
files.finalize(file_name)
blob_key=files.blobstore.get_blob_key(file_name)
print "Blob Key="
print blob_key
def main():
application=webapp.WSGIApplication([('/', MainHandler)],debug=True)
util.run_wsgi_app(application)
if __name__=='__main__':
main()
于 2011-06-06T22:19:08.963 回答
2
blobstore != datastore
.
只要您的数据小于 1MB ,您就可以在您的实体上使用 a读取和写入数据到数据存储区。db.BlobProperty
正如 Wooble 评论的那样,新的File API允许您写入blobstore,但除非您使用任务或类似 mapreduce 库的东西增量写入 blobstore-file ,否则您仍然受到 1MB API 读取/写入调用限制的限制。
于 2011-06-03T19:43:02.863 回答