我想用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
答案 0 :(得分:0)
两件事。
您无法在一个Content-Type
application/octet-stream
的响应中写入两个文件。要在响应中填充多个文件,您必须使用multipart/form-data
或multipart/mixed
对响应进行编码,并希望客户端能够理解并解析它并显示两个下载对话
在您拨打self.response.out.write(…)
后,您不应再设置标题。
对我而言,似乎最简单的选择是提供包含以下内容的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)
谢谢你,阿提拉。