从各种Stack Overflow线程收集了信息之后,我在Django中提出了以下视图函数以通过HttpResponse对象返回文本文件:

def serve_file(request):
    filepath = sampler_settings.ZIP_PATH + '/test_file'
    f = open(filepath, 'r')
    response = HttpResponse(f, content_type='application/force-download')
    response['Content-Disposition'] = 'attachment; filename="test_file"'
    return response


该函数是从前端调用的,如下所示:

function serve_file() {
        let url = 'http://127.0.0.1:8000/serve_file'
        fetch(url)
            .then(response => response.text())
            .then(text => console.log(text))
}


但是,唯一发生的是在浏览器控制台中打印了文件内容,但是下载没有开始:没有提示或任何提示。

这是在Ubuntu和Firefox上的开发服务器上。

可能是什么原因?

最佳答案

原因是通过ajax发出的http请求与来自浏览器的正常请求不同。 Ajax用JavaScript给您响应。因此,您必须从本地浏览器(使用window.location)请求文件,或通过JavaScript这样下载。

function serve_file() {
        let url = 'http://127.0.0.1:8000/serve_file'
        fetch(url)
            .then(response => response.text())
            .then(text => {

          const blob = new Blob(text, {type: 'application/forced-download'});
          const url = URL.createObjectURL(blob);
          const link = document.createElement("a");
          link.href = url;
          link.download = "file_name";
          document.body.appendChild(link);
          link.click();
    })
}

10-06 13:55
查看更多