服务器端python返回一个zip文件进行下载

时间:2019-05-03 19:43:13

标签: javascript python ajax

使用我的客户端,将参数传递到服务器上的python脚本,它运行一个进程并创建一个zip文件。在我的客户端JavaScript中,我的ajax调用只是告诉我它能够将数据传递给我的python脚本。

我尝试过sys.stdout.write(b"zipfilename"),但是什么也没有发生。如果我无法将文件传回,是否有办法将某些东西传回,以便我的JavaScript知道已完成?我没有使用NODE或Angular。我的python脚本确实运行并在服务器上创建了zip文件,但是JavaScript页面不知道它,也没有出现下载对话框。我缺少一些基本的东西,但找不到。

我的JS AJAX调用:

  $.ajax({
       url: theUrl,
       type: 'get',
       success: function(response){

       }      });

我的python脚本的结尾:

def createZip(v, charset=None):

    with ZipFile(v +'.zip', 'w') as myzip:
        myzip.write(v +'.shp')
        myzip.write(v +'.shx')
        myzip.write(v +'.dbf')
        myzip.write(v +'.prj')

    return 'c:/dev/python/'+ v + '.zip'

createZip(fn)

1 个答案:

答案 0 :(得分:2)

根据所提供的有限代码很难区分,但是这里有一些要点:

  • sys.stdout.write将写入运行Python脚本的应用程序的输出,而不是HTTP响应(除非它作为WSGI应用程序运行)。
  • 如果要在WSGI类型的应用程序中编写HTTP响应,则将需要包括整个HTTP响应正文,包括multipart和content type标头,以便浏览器知道返回的内容(否则只是毫无意义的字节的供稿。)
  • 仅当浏览器加载返回应用程序/八位字节流内容类型的页面(或链接到文件的锚点上设置了download属性)时,下载提示才会出现。
  • AJAX调用不会导致在前台浏览器中进行下载,它会出现在开发人员工具的“网络”标签中,并且AJAX响应变量将包含数据,但这不会自动推送到浏览器作为可下载文件。