2015-12-02 20 views
0

這裏是我目前使用的是我得到的文件上傳代碼:如何通過谷歌應用程序引擎與python燒瓶提供pdf(或非圖像)文件?

header = file.headers['Content-Type'] 
parsed_header = parse_options_header(header) 
blob_key = parsed_header[1]['blob-key'] 
UserObject(file = blobstore.BlobKey(blob_key)).put() 

在服務方面,我想這樣做,我對圖像做同樣的事情。也就是說,我得到UserObject,然後做 photoUrl = images.get_serving_url(str(userObject.file))

令我驚訝的是,這個黑客工作在本地服務器完美。然而,在生產,它拋出一個異常:

File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1794, in get_serving_url 
    return rpc.get_result() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result 
    return self.__get_result_hook(self) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1892, in get_serving_url_hook 
    raise _ToImagesError(e, readable_blob_key) 
TransformationError 

什麼是存儲/服務非圖像文件如PDF有道?

回答

0

請勿使用images API,因爲(至少在製作過程中)它會執行圖像內容/格式檢查並且您沒有提供圖像,所以不起作用。

你可以有一個處理自己的請求路徑的命名空間,就像在你的應用程序的任何其他處理,或許真的沿着這些線路:

def pdfServingUrl(request, blob_key): 
    from urlparse import urlsplit, urlunsplit 
    split = list(urlsplit(request.url)) 
    split[2] = '/PDF?key=%s' % blob_key.urlsafe() # rewrite the url 'path' 
    return urlunsplit(tuple(split)) 

並在處理程序爲/PDF*

blob_key = self.request.get('key') 
    self.response.write(blobstore.BlobReader(blob_key).read()) 

如果您使用the Blobstore API on top of Google Cloud Storage,則還可以使用直接GCS訪問路徑,如本答案中所述:https://stackoverflow.com/a/34023661/4495081

注意:上述代碼是一個準系統python的建議只是爲了訪問blob數據。額外的東西,如標題等沒有解決。

每@ NicolaOtasevic的評論,爲flask較完整的代碼可能是這樣的:

blob_info = blobstore.get(request.args.get('key')) 
response = make_response(blob_info.open().read()) 
response.headers['Content-Type'] = blob_info.content_type 
response.headers['Content-Disposition'] = 'filename="%s"' % blob_info.filename 
+0

非常感謝。這非常有幫助。我認爲在你需要的PDF處理程序中(因爲燒瓶,所以我們提供的是pdf而不是二進制文件):blob_info = blobstore.get(request.args.get('key')) response = make_response(blob_info。 open()。read()) response.headers ['Content-Type'] = blob_info.content_type response.headers ['Content-Disposition'] ='文件名=「%s」'%blob_info.filename。在我接受之前,您是否介意在您的回覆中糾正這一情況? –

+0

完成。感謝您的建議。 –

相關問題