【问题标题】:How to download several files with GAE Python如何使用 GAE Python 下载多个文件
【发布时间】:2013-12-22 00:58:55
【问题描述】:

我想下载几个带有 GAE Python 代码的文件。 我当前的代码如下所示

import webapp2, urllib
url1 = 'http://dummy/sample1.jpg'
url2 = 'http://dummy/sample2.jpg'

class DownloadHandler(webapp2.RequestHandler):
    def get(self):
        #image1
        self.response.headers['Content-Type'] = 'application/octet-stream'
        self.response.headers['Content-Disposition'] = 'attachment; filename="' + 'sample1.jpg' + '"'
        f = urllib.urlopen(url1)
        data = f.read()
        self.response.out.write(data)

        #image2
        self.response.headers['Content-Type'] = 'application/octet-stream'
        self.response.headers['Content-Disposition'] = 'attachment; filename="' + 'sample2.jpg' + '"'
        f = urllib.urlopen(url2)
        data = f.read()
        self.response.out.write(data)

app = webapp2.WSGIApplication([('/.*', DownloadHandler)], 
                              debug=True)

我预计使用此代码会出现两次下载对话,但实际上出现了一次,并且只下载了 sample2.jpg。 您如何处理多次下载对话?

我实际上也想实现上面添加的一些其他功能。 在浏览器上显示进度消息,例如
sample1.jpg 已下载
sample2.jpg 已下载
sample3.jpg 已下载...

并在下载文件后重定向到另一个页面。 当我写了一个代码比如

self.redirect('/otherpage')

之后

self.response.out.write(data)

只发生了重定向,没有发生下载过程。

请您给我任何解决它的想法。 我正在使用python2.7

【问题讨论】:

    标签: python google-app-engine http urllib webapp2


    【解决方案1】:

    我达到了我想做的目标。

    作为用户交互,生成html源代码如下

    <script type="text/javascript">
        window.open("/download?url=http://dummy/sample1.jpg")
        window.open("/download?url=http://dummy/sample2.jpg")
    </script>
    

    然后使用此代码处理创建的新窗口。

    class DownloadHandler(webapp2.RequestHandler):
        def get(self):
            url = self.request.get('url')
            filename = str(os.path.basename(url))
            self.response.headers['Content-Type'] ='application/octet-stream'
            self.response.headers['Content-Disposition'] = 'attachment; filename="%s"' % (filename)
    
            data = urllib.urlopen(url).read()
            self.response.out.write(data)
    
    app = webapp2.WSGIApplication([('/download', DownloadHandler)], debug=True)
    

    谢谢你,阿提拉。

    【讨论】:

      【解决方案2】:

      两件事。

      1. 您不能在一个具有Content-Typeapplication/octet-stream 的响应中写入两个文件。要在响应中填充多个文件,您必须使用 multipart/form-datamultipart/mixed 对响应进行编码,并希望客户端能够理解并解析它并显示两个下载对话框

      2. 一旦你已经调用了self.response.out.write(…),你就不应该再设置任何标题了。

      在我看来,最简单的选择是提供包含以下内容的 HTML 文件:

      <script>
        window.open('/path/to/file/1.jpg');
        window.open('/path/to/file/1.jpg');
      </script>
      

      …然后使用不同的处理程序处理这些路径。

      另一种选择是压缩这两个文件并将压缩文件提供给客户端,尽管在您的情况下它可能会或可能不会更可取。

      【讨论】:

      • 谢谢你,阿提拉。我尝试将 Content-Type 从 application/octet-stream 替换为 multipart/form-data,但结果和之前一样。
      • 我会尝试使用带有
      • 1000 次下载对于显示的对话数量和 zip 文件来说都太大了(动态请求的限制为 32Mb)。我认为,对于如此大的容量,您最好的选择是使用适当的提要和提要阅读器。可能对用户来说不是那么方便,但1000个下载框也不是。
      • 我知道处理海量数据是一种困难的方式,所以第一步,现在尝试下载 2 个文件。感谢您的建议,我几乎成功地通过“window.open”脚本下载了 2 个 img。实际上它没有下载,而是打开了带有目标图像的新窗口。如果它是 zip 文件格式,我猜它会被下载。然后我会尝试生成 zip 并找到它们,如果它已下载。
      • 尝试在提供图像时添加Content-Disposition: attachment; filename=foo.jpg 标头,这应该会导致浏览器下载它们而不是在浏览器中显示。但是对于 zip 或其他文件,它应该在没有该标题的情况下开始下载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2013-09-29
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多