python通过StreamingHttpResponse实现大文件下载,vue通过http的onDownloadProgress实现下载进度条


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM