根據後端的文件數據流,在前端造成下載的文件

實現原理:定義的接口不是下載文件的路徑,而是經過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

相關文章
相關標籤/搜索