1

工作正常的部分

我已经发出了一个<form>谁的提交调用发出了ajax请求。同样的代码:

 $.ajax({

            type: 'POST',
            url: '/uploaded_proto_file/',
            data: formdata,
            processData: false,
            contentType: false,

            success: function (data) {
                console.log("in success")
                console.log("data is --->"+data)
                return;

            },
            error: function (data) {
                console.log("in error")

                return;
            }

        });

我可以在下面的函数中收到相同的调用。现在我需要发送一个需要在我的浏览器中自动下载的文件(在我的文档结构中)。我根据这个答案执行这个功能

def uploaded_proto_file(request):
   with open(
            '/Users/metal/Documents/test_pb2.py','rb') as text_file:
        response = HttpResponse(FileWrapper(text_file.getvalue()), content_type='application/zip')
        response['Content-Disposition'] = 'attachment; filename=test_pb2.py'
        return response

上面的代码运行不正常,所以我调试了一下,在filewrapper语句中发现了这个错误

错误快照

现在我稍微更改了解决方案,但是作为响应发回的文件没有自动下载,它正在控制台中打印(因为我在 ajax 函数中的成功块有 console.log(data))
更改了解决方案:

with open(
            '/Users/metal/Documents/test_pb2.py','rb') as text_file:
        response = HttpResponse(text_file, content_type='application/zip')
        response['Content-Disposition'] = 'attachment; filename=test_pb2.py'
        return response

正如您在上面看到的,我删除了FileWrapper并且至少能够将文件发送回ajax请求。但问题仍然存在,因为文件没有自动下载。

PS:我也尝试过file以'r','rb'等不同模式打开。

任何帮助,将不胜感激 !

4

1 回答 1

0

您不能将文件返回到 ajax 请求并期望它被下载。你需要的是分成几个步骤:

  • 您的 ajax 请求触发文件创建过程
  • Django 将该文件放在可以下载的地方,并将 URL 作为 ajax 响应返回到该文件
  • 您的 js 响应处理程序现在可以做两件事:
    1. 在 HTML 中生成一个按钮,供用户单击并下载文件(使用响应中的 URL)
    2. 创建按钮并自动单击它(调用.click()它),然后再次将其删除。有点像这个例子
于 2018-04-14T16:22:44.110 回答