如何使用GAE Python下载多个文件

时间:2013-12-05 07:32:52

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

我想用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

2 个答案:

答案 0 :(得分:0)

两件事。

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

  2. 在您拨打self.response.out.write(…)后,您不应再设置标题。

  3. 对我而言,似乎最简单的选择是提供包含以下内容的HTML文件:

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

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

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

答案 1 :(得分:0)

我达到了我想要做的目标。

作为用户互动,生成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)

谢谢你,阿提拉。