从各种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();
})
}