ドキュメントをblobstoreに保存し、ハンドラー(タスクを処理する)内で取得しようとしています。blobstoreの使用方法に関するappengineのドキュメントを読みましたが、私の場合はそれを機能させるのに苦労しています。ハンドラー内で次のことを試しましたが、オブジェクトを保存されたファイル(.pdfや.txtなど)として返すことができないようです。
class SendDocuments(webapp2.RequestHandler):
def post(self):
document_key = self.request.get("document_key")
document_key = Key(str(document_key))
the_document = DocumentsModel.all().filter("__key__ =", document_key).get()
file_data = blobstore.BlobInfo.get(str(the_document.blobstore_key)) # returns a blobinfo object
file_data.open() # returns a blobreader object
file_data.open().read() # returns a string
私も試しました
class ServeSavedDocument(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, blob_key):
self.send_blob(blob_key, save_as=True)
return
class SendDocuments(webapp2.RequestHandler):
def post(self):
document_key = self.request.get("document_key")
document_key = Key(str(document_key))
the_document = DocumentsModel.all().filter("__key__ =", document_key).get()
grab_blob = ServeSavedDocument()
file_data = grab_blob.get(self, str(the_document.blobstore_key))
しかし、ServeSavedDocumentの呼び出しは次のように失敗します。
'NoneType' object has no attribute 'headers'
私はファイルAPIを見てきましたが、ファイルを保存していない唯一の例は、単にblobキーを返すようです。
blob_key = files.blobstore.get_blob_key(file_name)
ハンドラー内からblobstoreに保存されたファイルを取得するための最良の方法は何ですか?
編集1:
次のコードを使用して、POSTリクエストでファイルとしてエンコードできる形式/状態でblobstoreからtxtファイルまたはpdfファイルを取得しようとしています
from google.appengine.api import urlfetch
from poster.encode import multipart_encode
# assuming here that file_data is the file object
payload = {}
payload['user_id'] = '1234123412341234'
payload['test_file'] = MultipartParam('test_file', filename=file_data.filename,
filetype=file_data.type,
fileobj=file_data.file)
data,headers= multipart_encode(payload)
send_url = "http://127.0.0.0/"
t = urlfetch.fetch(url=send_url, payload="".join(data), method=urlfetch.POST, headers=headers)