标题:
python文件操作工具类(1)
[打印本页]
作者:
look_w
时间:
2019-3-4 19:18
标题:
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
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0