【问题标题】:Return ZIP file over AJAX通过 AJAX 返回 ZIP 文件
【发布时间】:2016-08-02 15:10:15
【问题描述】:

我需要下载文件,这是通过 AJAX 触发的。我的代码从临时文件夹中的 URL 检索图像,并在此临时文件夹中创建文件的内存 zip。我想将文件路径推送到客户端。我该怎么做?

这是我的邮政编码:

#This function creates a temp folder, downloads images in it and returns the path
temp_dir = retrieve_images(file_paths)

in_memory_loc = io.BytesIO()

zipf = zipfile.ZipFile(, 'w')
zipdir(temp_dir, zipf)
zipf.close()

#remove the temp directory
shutil.rmtree(temp_dir)

in_memory_loc.seek(0)

#output the zip file to the browser
return send_file(in_memory_loc, attachment_filename='site_images.zip', as_attachment=False)

这在我使用传统的表单提交方式时有效。但我需要通过 AJAX 返回它。通过 AJAX 返回文件似乎是不可能的,因此我想返回 zip 文件路径。我该怎么做?

【问题讨论】:

  • 我可能会考虑从这个问题中删除代码和 Python 标记,因为据我所知,这是一个与 Python 或 zip 文件无关的一般网络问题。
  • 是的,但我使用的语言是 Python。人们通常倾向于为他们编码的语言找到答案!

标签: jquery python ajax flask zip


【解决方案1】:

(没有 ajax)
您可以使用 Jquery 点击功能中的窗口位置来下载 zip 文件......

 $(this).ready(function() {
        $("#downloadBtn").click(function() {
            var formdata= $("#formId").serialize();
            window.location="download.action?"+formdata;
        });
    });

【讨论】:

    【解决方案2】:

    创建该资源的 url 并将其发送回 ajax,使用window.open('url') 触发下载;在成功函数中

    您有临时目录的名称和文件的名称,您拥有构建 url 所需的一切

    【讨论】:

    • 这正是我卡住的地方。如何创建指向内存位置的 URL?
    【解决方案3】:

    You can't prompt a file download with an XHR response,因此服务器必须保留 zip 文件的内容并等待客户端发出第二个 HTTP 请求以执行下载。

    一种方法是将内容存储在 memcache 中的随机生成的密钥下,然后将密钥与 XHR 响应一起返回。然后客户端可以在非 XHR 请求中将该密钥传递回服务器以请求文件。

    【讨论】:

    • 如何创建指向内存位置的 URL?或者,我将如何告诉 zipfile 将该 zip 存储在同一临时位置?抱歉,我是新手。
    猜你喜欢
    • 2011-04-10
    • 2012-10-27
    • 2020-05-11
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多