【问题标题】:google appengine - let user download a filegoogle appengine - 让用户下载文件
【发布时间】:2012-01-01 00:08:17
【问题描述】:
class PDF(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = "application/txt"
        self.response.headers['Content-Disposition'] = "attachment; filename=file.pdf"
        f = open('/Users/BP/file.pdf', 'r')
        self.response.out.write(f.read())
def main():
    application = webapp.WSGIApplication([('/download', PDF)],
                                        debug=False)
    util.run_wsgi_app(application)

当我尝试下载它时出现此错误:

[Errno 13] Permission denied: '/Users/BP/file.pdf'
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 701, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/s~projectname/1.354763951774324185/main.py", line 43, in get
    f = open('/Users/BP/file.pdf', 'r')
IOError: [Errno 13] Permission denied: '/Users/BP/file.pdf'

尽管我已经尝试过chmod a+r file.pdf 请帮忙。谢谢!

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    os.path.dirname(__file__) 为您提供应用程序目录。

    f = open(os.path.dirname(__file__) + /'BP/file.pdf', r)

    将您的文件存储在主文件夹内的 BP/ 文件夹中。

    @Nicke,@Jon:GAE 允许访问您的文件。 “愿源与你同在”。

    【讨论】:

    • GAE中的“正确”方式是在app.yaml中使用静态文件句柄,如果你喜欢DIY风格,试试这个Webob例子,效率更高。
    • 我看到一些框架会这样做,我不确定是否建议我们在执行 WSGI 时使用osmodule。当然,既然 UNIX 中的“一切都是文件”,那么您自然会说我在这里错了。好吧,如果你想使用 to os 模块,我不确定它与 WSGi 的前向兼容性如何。如果您正在编写 WSGI,我不确定是否建议使用 os 模块。
    • @AlvinK。如果您需要从请求处理程序提供文件,例如在获取 REST 请求并在请求处理程序中评估条件时,如果为 true,则应发送文件,如果为 false,则应发送 json 字符串。在 app.yaml 中使用静态文件句柄是不可能的,对吧?
    • @PeterWarbo:我会使用custom error response 来处理错误。否则你可以试试 SO 的catch all errors
    【解决方案2】:

    GAE 无权访问文件。如果要提供文件,请从静态目录或 blobstore 提供文件。

    【讨论】:

      【解决方案3】:

      运行 AppEngine 的用户没有目录的读取权限。尝试 chmod BP 目录。

      但即便如此,一旦您部署了您的应用程序,这将不起作用。 App Engine 中没有文件系统的概念。我建议您将文件存储在 blob 或数据存储中。或静态目录。

      【讨论】:

      • “App Engine 上没有文件系统的概念”——这完全不正确。文件系统只是只读的。
      • 你当然是对的。我想说的是,您不能将东西放在系统上的随机文件夹中,对其进行 chmod 修改,并期望它在部署后能够正常工作。
      • 有趣的 cmets 家伙。什么是文件? “在 UNIX 中,一切都是文件”,我不同意这种说法。
      • 我们期待(Linux 创建者)Linus Torvards。他自己的话: UNIX 哲学经常被引用为“一切都是文件”,但这实际上意味着“一切都是字节流”。
      【解决方案4】:

      也可以提供静态文件,不需要处理程序

      - url: /sampleData\.csv
        static_files: sampleData.txt
        upload: sampleData\.csv
        http_headers:
          Content-Type: text/csv
          Content-Disposition: "attachment; filename=sample.csv"
      

      【讨论】:

        猜你喜欢
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多