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