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 }) }