4

ドキュメントを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)
4

3 に答える 3

4

さて、何度もいじった後、これが機能することがわかりました!重要なのは、blobinfoオブジェクトでopen()を呼び出すことでした。

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))
        payload = {}
        payload['user_id'] = '1234123412341234'
        payload['test_file'] = MultipartParam('the_file', filename="something",
                                      filetype=file_data.content_type,
                                      fileobj=file_data.open())
于 2012-04-25T19:52:40.093 に答える
0

BlobReaderクラスを見てください。それがあなたが探しているものだと思います: https ://developers.google.com/appengine/docs/python/blobstore/blobreaderclass

これにより、blobstoreデータへのファイルのような読み取りアクセスが可能になります。

# blob_key = ..

# Instantiate a BlobReader for a given Blobstore value.
blob_reader = blobstore.BlobReader(blob_key)
# Read the entire value into memory. This may take a while depending
# on the size of the value and the size of the read buffer, and is not
# recommended for large values.
value = blob_reader.read()
于 2012-04-23T16:15:26.337 に答える
0

このようにしてみて、ファイル名を指定すると、次のように入力しますsend_blob()

def mime_type(filename):
    return guess_type(filename)[0]
    class ServeSavedDocument(blobstore_handlers.BlobstoreDownloadHandler):
        def get(self):
            blob_key = self.request.get("blob_key")
            if blob_key:
                blob_info = blobstore.get(blob_key)               
                if blob_info:
                    save_as1 =  blob_info.filename
                    type1=mime_type(blob_info.filename)
                    self.send_blob(blob_info,content_type=type1,save_as=save_as1)
于 2012-04-23T18:09:27.447 に答える