首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

python文件操作工具类(1)

python文件操作工具类(1)

# coding:utf-8
import base64
import os

import time
import datetime
import shutil
import zipfile

from django.conf import settings
from django.http import HttpResponse

from common.utils.utils_log import log

# ===============================================================
# 文件上传工具类 基础环境:python 3.6
# ===============================================================


class FileUploadUtil(object):
    """
    文件上传下载工具类
    """
    file_obj = None             # 待上传文件对象
    file_name = None            # 传入的文件名【不带扩展名】
    file_extension = None       # 传入的文件类型【文件扩展名】

    new_file_name = None        # 新的文件名,存入时文件名【新文件名,带扩展名】
    real_path = None            # 文件实际全路径【目录】
    file_path = None            # 文件存放路径【相对路径】
    absolute_path = None        # 文件绝对路径【C:/tmp/test.zip】
    max_size = None             # 文件上传大小限制

    def __init__(self, src_file_obj, dst_file_path=settings.UPLOAD_DEFAULT_FOLDER, max_size=settings.UPLOAD_DEFAULT_SIZE):
        """
        初始化文件上传对象
        :param src_file_obj: 待上传文件流
        :param dst_file_path: 待上传文件存放路径(默认上传到media/tmp目录)
        :param max_size: 默认文件上传大小
        """
        self.file_obj = src_file_obj
        self.set_file_info(src_file_obj.name)
        self.set_new_name()
        self.set_real_path(dst_file_path)
        self.max_size = max_size
        self.file_path = "%s%s" % (dst_file_path, self.new_file_name)
        self.absolute_path = "%s%s" % (self.real_path, self.new_file_name)

    def set_file_info(self, src_file_name):
        """
        从传入的文件名中拆分文件名称和文件格式
        :param src_file_name: 待操作的文件全路径名称
        :return:
        """
        file_tmp_name, file_extension = FileOperateUtil.extract_file_name(src_file_name)
        self.file_name = file_tmp_name
        self.file_extension = file_extension

    def set_new_name(self):
        """
        根据文件类型,加上当前时间的年月日时分秒生成新的文件名
        :return:
        """
        current_timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        self.new_file_name = "%s%s" % (current_timestamp, self.file_extension)

    def set_real_path(self, dst_file_path):
        """
        设置文件实际文件路径(拼接上:settings.MEDIA_ROOT)
        :param dst_file_path: 文件存放文件夹路径
        :return: 文件绝对路径
        """
        self.real_path = "%s/%s" % (settings.MEDIA_ROOT, dst_file_path)

    def upload_file(self, is_new_folder=False):
        """
        上传文件:
            上传的文件数据,可直接从FileUploadUtil对象中获取
        :param is_new_folder: 若目录不存在时,是否自动新建该目录
        :return: 返回boolean 成功返回true,失败返回false
        """
        try:
            # 第一步判断文件目录是否存在,不存在会抛出异常
            FileOperateUtil.validate_folder_exists(self.real_path, is_new_folder)
            # 判断文件大小
            FileOperateUtil.validate_file_size(self.file_obj, self.max_size)
            # 上传文件到指定目录
            FileOperateUtil.copy_file_chunks(self.file_obj, self.real_path+self.new_file_name)
        except Exception as e:
            log.debug("文件上传发生异常,%s" % e)
            return False
        return True

    @staticmethod
    def download_file(src_file_path, down_file_name=None):
        """
        下载文件,返回带有文件流的response响应
        :param src_file_path: 待下载文件路径
        :param down_file_name: 下载时指定文件名
        :return: 带有文件流的response响应
        """
        real_path = "%s/%s" % (settings.MEDIA_ROOT, src_file_path)
        # 判断该文件目录是否存在
        if os.path.exists(real_path):
            # 判断文件是否是文件
            if os.path.isfile(real_path):
                # 获取文件本身自己的名称
                filename = os.path.basename(real_path)
                # 若未指定下载文件名,则已文件本身名称为准
                if down_file_name is None:
                    down_file_name = filename
                # 读取文件流,并构造请求响应
                response = HttpResponse(FileOperateUtil.file_iterator(real_path))
                # 设置响应流
                response['Content_type'] = "application/octet-stream"
                response['Content-Disposition'] = 'attachment; filename={0}'.format(down_file_name.encode('utf-8').decode('utf-8'))
            else:
                response = HttpResponse("下载失败,不是一个文件!", content_type="text/plain;charset=utf-8")
        else:
            response = HttpResponse("文件不存在,下载失败!", content_type="text/plain;charset=utf-8")
        return response
返回列表