我目前使用以下代码允许我的用户上传文件;
uploadurl = blobstore.create_upload_url('/process?session=' + session, gs_bucket_name='mybucketname')
我可以像这样提供图像;
imgurl = get_serving_url(blob_key, size=1600, crop=False, secure_url=True)
使用第一个代码段中的方法上传内容后,blob键包含encoded_gs_file:
,这就是它知道从Google Cloud Service而不是blobstore作为标准提供服务的方式。
但是,我不确定我将如何提供任何其他类型的文件(例如.pdf或.rtf)。我 不 希望内容在浏览器中显示,而是作为下载发送到客户端(因此他们获取保存文件对话框并在其上选择一个位置计算机来保存它。)
我该怎么做呢?感谢。
答案 0 :(得分:1)
使用google serve_url仅适用于图片。
要从blobstore提供pdf,您可以使用:
class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
(blob_key, extension) = resource.rpartition('.')[::2]
blob_info = blobstore.BlobInfo.get(blob_key)
if not blob_info:
logging.error('Blob NOT FOUND %s' % resource)
self.abort(404)
self.response.headers[b'Content-Type'] = mimetypes.guess_type(blob_info.filename)
self.send_blob(blob_key, save_as=blob_info.filename)
此处理程序的webapp2路由如下所示:
webapp2.Route(r'/dynserve/<resource:(.*)>', handler=DynServe)
服务:
<a href="/dynserve/<blob_key>.pdf">PDF download</a>
答案 1 :(得分:1)
我将根据@voscausa
的答案回答我自己的问题这就是我的处理程序的样子(在名为view.py
)的文件中;
class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
blob_key = resource
if not blobstore.get(blob_key):
logging.warning('Blob NOT FOUND %s' % resource)
self.abort(404)
return
else:
blob_info = blobstore.BlobInfo.get(blob_key)
self.send_blob(blob_key, save_as=blob_info.filename)
我们需要app.yaml
;
- url: /download/.*
script: view.app
secure: always
secure: always
是可选的,但我总是在处理用户数据时使用它。
将其放在view.py
;
app = webapp.WSGIApplication([('/download/([^/]+)?', DynServe),
], debug=False)
现在访问/下载/ BLOB_KEY_HERE。 (您可以检查数据存储区中的blob密钥)
这是一个完全有效的示例,适用于标准blob商店和Google Cloud Service。
注意:作为GCS一部分的所有blob密钥都将以encoded_gs_file:
开头,而那些不在标准blobstore中的blob密钥;应用引擎自动使用它来确定文件的位置