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