私の問題は、ユーザーがテキスト ファイルをアプリにアップロードすることに関係しています。データストアに保存する前に、このファイルを取得してアプリで処理する必要があります。私が読んだ少しのことから、ユーザーのアップロードは BLOB としてデータストアに直接送られることを理解しています。これは、そのファイルを取得し、そのファイルに対して操作を実行し (内部のデータを変更することを意味します)、それをデータストア。これらの操作はすべてアプリで行う必要があります。残念ながら、データストアのドキュメントhttp://code.google.com/appengine/docs/python/blobstore/overview.htmlによると 、アプリはデータストアに blob を直接作成できません。それが私の主な頭痛です。ユーザーのアップロード操作なしで、アプリからデータストアに新しい BLOB/ファイルを作成する方法が必要です。
2277 次
2 に答える
2
blobstore != datastore
.
エンティティでを使用して、データが 1 MB 未満である限り、好きなだけデータストアにデータを読み書きできます。db.BlobProperty
Wooble がコメントしているように、新しいFile API を使用するとblobstoreに書き込むことができますが、タスクまたは mapreduce ライブラリなどを使用して blobstore-file にインクリメンタルに書き込む場合を除き、読み取り/書き込みの 1MB API 呼び出し制限によって依然として制限されます。
于 2011-06-03T19:43:02.863 に答える
2
ご協力いただきありがとうございます。眠れぬ夜を何度も過ごし、App Engine の本を 3 冊読み、Google でいろいろ調べた結果、答えが見つかりました。これがコードです(かなり自明のはずです):
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 に答える