【问题标题】:Python App Engine - Blobstore for non-imagesPython App Engine - 非图像的 Blobstore
【发布时间】:2015-02-18 02:18:55
【问题描述】:

在我的 Python Appengine“应用程序”中,我被要求“附加任何文件”,因此我有以下代码 sn-p 来“显示”这些文件...

blobattach = ''
blobmime   = 'None'
if pattachment.blobkey <> None:
    blobattach = get_serving_url(pattachment.blobkey)  # <-- line 104
    blob_info  = blobstore.BlobInfo.get(pattachment.blobkey)
    blobmime   = blob_info.content_type[:5]
    blobname   = blob_info.filename

使用以下 HTML

{% if blobmime == 'None' %}
{% else %}
    {% if blobmime == 'image' %}
        <img src="{{ blobattach }}" alt='Attachment'/>
    {% else %}
        <br/>
        <small><a class="fswideb" href="{{blobattach}}" Title="Download to view"><span>Download to view {{ blobname }}</span></a></small>
    {% endif %}
{% endif %}

如果附件是图像,则会显示(blobmime=='image')。如果没有,则会显示一个链接,以便用户可以下载文件并以他们可以的方式查看它。

但是,虽然这在开发中有效,但在我的笔记本电脑(Google App Engine Launcher)上,尝试“提供” .xls 文件时出现以下错误。 (.jpg 附件没有错误)

File "/base/data/home/apps/s~fs-rentals/20140101.382312463312950329/fmntjobattachmaint.py", line 104, in display
blobattach = get_serving_url(pattachment.blobkey)
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)

转换错误

所有示例都使用图像,我对它们没有任何问题,在开发中确实没有问题。关于我可能错过的任何想法?

非常感谢 大卫

按照建议,我将上述内容更改为使用 Google Cloud Storage。我仍然得到完全相同的错误。如果 blob 不是图像,则 get_serving_url 函数会出错。不是图像的文件是否有等价物?

https://cloud.google.com/appengine/docs/python/tools/webapp/blobstorehandlers#BlobstoreUploadHandler 的示例提供了一个非常好的示例,说明我正在尝试做的事情,除了我可能想添加此人的简历而不是他们的照片。

谢谢 大卫

【问题讨论】:

  • 当您说“这在开发中有效”时,我认为您的意思正好相反——它在部署到 apppot 时有效,但在开发应用服务器中,例如“on你的笔记本电脑”。我建议避免使用 blobstore 并使用更新的、闪亮的cloud.google.com/appengine/docs/python/googlecloudstorageclient 代替(在部署中,旧的 blobstore API 是在此基础上实现的——但使用真正的 GCS 在部署和本地开发中都应该可以正常工作,在后一种情况下是 GCS在您自己的当地时间之上实施)。
  • 我去看看,然后告诉你。感谢您的快速回复。
  • 我仍然看到你在 Q 中使用 blobstore API -- 你的代码在哪里切换到 cloud.google.com/appengine/docs/python/googlecloudstorageclient ...?

标签: python google-app-engine


【解决方案1】:

解决了我的问题。我试图在一个“屏幕”上做太多事情

如果 blob 是图像 - get_serving_url 如上所述。
如果 blob 不是图像 - 显示指向不同页面 (target='_blank') 的链接,该页面执行以下操作(几乎从另一个 SO 帖子复制):

    if rmntjobattach.mntjobattachid <> 0 \
    and rmntjobattach.blobkey:
        blob_info = blobstore.BlobInfo.get(rmntjobattach.blobkey)
        self.send_blob(blob_info)
    else:
        self.error(404)   

诀窍是在用户请求时在同一页面上显示图像 blob,并在新页面上显示其他所有内容(单击链接)

大卫

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 2013-12-25
    • 1970-01-01
    • 2014-04-04
    • 2019-04-02
    • 1970-01-01
    • 2015-04-07
    • 2015-02-07
    • 2013-12-06
    相关资源
    最近更新 更多