如何使用jqueryajax在web2py中下载(zip)文件

如何使用jqueryajax在web2py中下载(zip)文件,ajax,download,web2py,Ajax,Download,Web2py,zip文件以“下载数据”形式写入,返回时没有错误或下载响应 注: 从函数返回的打印数据似乎是zipfile数据 我没有增加或使用download.stream或response.download,也不知道在这种情况下是否有必要 请指出以下ajax调用和/或控制器函数中缺少什么,以便生成zip文件下载 jQuery.ajax({method:'get',url:'{{=URL('download_data')}}',                 data:fileIDs,        

zip文件以“下载数据”形式写入,返回时没有错误或下载响应

注:

  • 从函数返回的打印数据似乎是zipfile数据

  • 我没有增加或使用download.stream或response.download,也不知道在这种情况下是否有必要

请指出以下ajax调用和/或控制器函数中缺少什么,以便生成zip文件下载

jQuery.ajax({method:'get',url:'{{=URL('download_data')}}',
                data:fileIDs,
                success: function(){}

                });

# function in web2py controller
def download_data():
    import zipfile
    import cStringIO
    import contenttype as c
    vars = request.vars
    tempfile = cStringIO.StringIO()
    temparchive = zipfile.ZipFile(tempfile, 'w', zipfile.ZIP_DEFLATED)

    fileIDs = vars.values()
    try:
        for file_id in fileIDs:
            file = db.files[file_id].file
            fileLoc = db.files.file.retrieve_file_properties(file)['path'] + '/' + file
            temparchive.writestr(db.files[file_id].file_name, open(fileLoc, 'rb').read())

    finally:
        temparchive.close() #writes 
        response.headers['Content-Disposition'] = 'attachment;filename=files.zip'
        response.headers['Content-Type'] = 'application/zip'
        rtn = tempfile.getvalue()
        tempfile.close()
    return rtn

从技术上讲,下载不能由ajax请求触发。您必须将window.location设置为文件的URL(在web2py中,这是返回文件数据的控制器函数的URL),或者依赖html5的“当前可疑”下载规范


有关更多详细信息,请参阅,关于这个问题的web2py来源:

通常,当您希望客户端下载某些内容时,您不会使用ajax来检索它。只需将用户发送到一个新选项卡,url就是要下载的文件。在这种情况下,似乎需要ajax来发送所选的文件id,并执行控制器逻辑来创建zipfile并检索文件的每个位置以读取并放入zip。一点也不需要。ajax所做的只是生成一个url,比如
http://domain.com?foo=bar&baz=helloworld&id=6
然后将其与XMLHttpRequest一起使用。您可以使用
轻松创建相同的urlhttp://domain.com?“+$.param(data)
,并将其设置为隐藏iframe或新选项卡的src。在这种情况下,文件数据仅在服务器上存在,直到出现ajax请求,因此它仍需要进行调用以检索数据。请这样看。当然,可以获取从ajax请求返回的数据并打开下载提示符。但是,它只在少数几个现代浏览器中工作,需要一些额外的逻辑才能工作,而另一种方法在所有浏览器中都可以工作,甚至不需要ajax请求。