根据后端的文件数据流,在前端造成下载的文件

实现原理:定义的接口不是下载文件的路径,而是经过API能够得到文件的内容,由前端把内容写入到文件中,这种方法是经过获取文件信息,在网页上利用click事件,建立一个文件,而后将文件信息写入到文件中,而后保存。javascript

主要用到了JavaScript中的Blob对象和HTML5中的FileReader对象。代码以下:css

python/django:html

from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt import csv from django.http import StreamingHttpResponse #下载 @csrf_exempt def download(request): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' writer = csv.writer(response) writer.writerow(['First row', 'Foo', 'Bar', 'Baz']) writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"]) return response

js:前端

<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
axios.post('/article/download/', {}, { responseType: 'blob' }).then((res) => { console.log('res', res); const blob = res.data; const reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = (e) => { const a = document.createElement('a'); a.download = `csv.csv`; // 后端设置的文件名称在res.headers的 "content-disposition": "form-data; name=\"attachment\"; filename=\"20181211191944.zip\"", a.href = e.target.result; console.log(e.target.result); document.body.appendChild(a); a.click(); document.body.removeChild(a); }; }).catch((err) => { console.log(err.message); });

FileReader:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReaderjava

https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL#Live_Resultpython

Blob:https://developer.mozilla.org/zh-CN/docs/Web/API/Blobios

相关文章
相关标签/搜索