[英]How can I retrieve a file object from the blobstore within a handler?
我已經在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中保存文件的最佳方法是什么?
我正在嘗試從blobstore中檢索txt文件或pdf文件,格式/狀態可以使用以下代碼在post請求中編碼為文件
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)
好吧,在經歷了很多混亂之后,我發現這很有效!關鍵是簡單地在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())
看看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()
試試這個,在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.