1.python后台实现下载接口
1.1通用文件流下载
import os
import time
from django.http import StreamingHttpResponse
def download_file_blob(name, url):
"""
:param name: 文件名称(带后缀)
:param url: 文件路径
:return: 解析后数据
"""
# 文件读取
# chunk_size 单次读写大小
def file_iterator(file_name, chunk_size=5120):
with open(file_name, 'rb') as file:
while True:
char_buffer = file.read(chunk_size)
if char_buffer:
yield char_buffer
else:
break
# 下载限速
# time.sleep(0.001)
if os.path.exists(url):
response = StreamingHttpResponse(file_iterator(url))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = f'attachment;filename={name}'
# 设置下载文件总大小
file_info = os.stat(url)
response['Content-Length'] = file_info.st_size
return response
return None
1.2csv文件下载
import os
import csv
import time
from django.http import StreamingHttpResponse
def download_file_csv(name, url):
"""
:param name: 文件名称(带后缀)
:param url: 文件路径
:return: 解析后数据
"""
# 文件读取
# chunk_size 单次读写大小
def file_iterator():
yield ["标题1", "标题2", "标题3", "标题4"]
# 实际数据
rows = [r for r in range(10000)]
for row in rows:
yield [row, "a", "b", "c"]
# 下载限速
# time.sleep(0.001)
if os.path.exists(url):
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(row) for row in file_iterator()), content_type="text/csv")
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = f'attachment;filename={name}'
return response
return None
# 文件流输出
class Echo(object):
def write(self, value):
return value
2.vue实现文件下载
import axios from "axios";
function download() {
axios({
url: "/api/data/downloadFileData/",
method: "get",
responseType: "blob",
params: {
name: "文件名称.txt",
url: "文件路径"
},
onDownloadProgress: evt => {
// 进度条处理
console.log(evt)
},
timeout: 0
})
}