2011-06-03 13 views
4

私の問題は、ユーザーがアプリケーションにテキストファイルをアップロードすることを中心に行われています。このファイルを取得し、データストアに保存する前にアプリで処理する必要があります。ちょっと読んだところでは、ユーザーのアップロードがブロブとしてデータストアに直接移動することがわかりました。そのファイルを取得して操作を実行すると(内部のデータの変更を意味します)、データストア。これらの操作はすべてアプリで行う必要があります。 データストアのドキュメントから残念ながら、http://code.google.com/appengine/docs/python/blobstore/overview.html は、アプリケーションがデータストアにBLOBを直接作成できません。それが私の頭痛です。私は、ユーザーアップロードのやりとりなしに、アプリケーションからデータストアに新しいBLOB /ファイルを作成する方法が必要です。Google App Engineのデータストアでファイルを操作する方法

+0

http://code.google.com/appengine/docs/python/blobstore/overview.html#Writing_Files_to_the_Blobstoreを参照してください。ファイルAPIを使用してプログラムによってブロブストアに書き込むことができます。 (注:これはプログラムでブロブを作成できないという同じページにあります;ドキュメントを最新の状態に保つために):) – geoffspear

答えて

2

blobstore != datastore

あなたはあまりにも長い間、あなたのデータはあなたのエンティティにdb.BlobPropertyを使用して< 1MBですと好きな限りストアにデータを読み書きすることができます。 Woobleコメントとして

、新しいFile APIはあなたがブロブストアに書き込むことができますが、あなたはインクリメンタルタスクやMapReduceのライブラリのようなものを使用してブロブストア・ファイルに足すされていない限り、あなたはまだのために1MBのAPI呼び出しの制限によって制限されています読み書き。

+1

さらに、アップロードにブロブストアを明示的に使用すると、ユーザーアップロードはブロブストアに直接移動します他の場合は、他のフォームと同様にアプリに送信されます。 –

2

ありがとうございました。多くの眠れない夜、3つのApp Engine Books、たくさんの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() 
関連する問題