我想下载几个包含 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
最佳答案
两件事。
如果
Content-Type
为application/octet-stream
,您不能在一个响应中写入两个文件。要在响应中填充多个文件,您必须使用multipart/form-data
或multipart/mixed
对您的响应进行编码,并希望客户端能够理解并解析并显示两个下载对话框一旦您已经调用了
self.response.out.write(…)
,您就不应再设置任何 header 。
对我来说,最简单的选择似乎是提供一个包含如下内容的 HTML 文件:
<script>
window.open('/path/to/file/1.jpg');
window.open('/path/to/file/1.jpg');
</script>
...然后使用不同的处理程序处理这些路径。
另一种选择是压缩这两个文件并将 zip 文件提供给客户端,尽管在您的情况下它可能更可取,也可能不是。
关于python - 如何使用 GAE Python 下载多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20394025/