appengine将数据作为文件下载发送

时间:2012-05-07 22:38:46

标签: google-app-engine

我是python和appengine的新手。所以我有这个简单的问题。我想发送服务器数据并让服务器将其作为文件下载发回。如果我这样做,我可以下载文件它在页面加载之前。但之后我无法下载。这就是我现在所拥有的:

class UploadHandler(webapp.RequestHandler):

  def get(self):
    try:    
        xml=parseString(self.request.body)
        result=sanitize(xml)
        if result == None:
          text=xml.toxml('UTF-8')
          name="file.xml"   
          self.response.out.write(text)
          self.response.headers.add_header('Method','get')
          self.response.headers.add_header('Content-Type','text/xml')
          self.response.headers.add_header('name',name)
          self.response.headers.add_header('Content-Disposition','attachment')
          self.response.headers.add_header('filename',name)
          self.response.headers.add_header('Content',text)
   except:
        print self.request.body

以下是调用它的javascript:

        var text=getMarkup();
        new Ajax.Request("http://localhost:8080/file",{
        method:'get',
        contentType:"text",
        postBody:text,
        onSuccess:function(){
            console.log(transport.responseText);            
        },          
        onFailure: function(){ 
            console.log('Could not load file...'); 
        },
        onException: function(req,exception) {
            console.log(exception);
            return true;
            }, 
        });

我尝试过多种不同的方式更改两个部分。我可以得到回复,但我无法进行下载。如果我使用相同的代码进行主页,它可以正常工作我错过了什么?

终于搞定了.... 我使用此页面上的示例here 只有我将网址作为响应发回,并在" onsuccess"中使用了window.open。处理程序打开它。

blobstore的问题是文件保存在服务器上而其他人可以查看它们,所以我最好的解决方案就是使用全局变量来保存帖子中的数据,然后将其传递给get和call从window.open()获取javascript。

2 个答案:

答案 0 :(得分:4)

我认为这会有所帮助

import mimetypes
...... 

(content_type, _) = mimetypes.guess_type(name)
self.response.headers['Content-Type'] = content_type
self.response.headers['Content-Disposition'] = 'attachment; filename=' + name
self.response.out.write(text) 
顺便说一下。您还可以使用blobstore保存文件并下载blob文件。

答案 1 :(得分:0)

您是否尝试过Content-Type:application / force-download? 它将指示您正在从服务器发送文件,并且该用户想要下载(而不是查看)它。

self.response.headers.add_header('Content-Type','application/force-download')