python实现文件上传

2021-09-01  本文已影响0人  KS保

用于flask框架中,用户上传指定格式的图片到本地服务器

# -*- coding: utf-8 -*-
from flask import request
from werkzeug.utils import secure_filename
from random import Random
import time
import os


class Uploader:
    #错误消息
    __stateMap = {
        'SUCCESS': 'SUCCESS',
        'ERROR_TMP_FILE': '临时文件错误',
        'ERROR_TMP_FILE_NOT_FOUND': '找不到临时文件',
        'ERROR_SIZE_EXCEED': '文件大小超出网站大小',
        'ERROR_TYPE_NOT_ALLOWED': '文件类型不允许',
        'ERROR_CREATE_DIR': '目录创建失败',
        'ERROR_DIR_NOT_WRITEABLE': '目录没有写权限',
        'ERROR_FILE_MOVE': '文件保存时出错',
        'ERROR_FILE_NOT_FOUND': '找不到上传文件',
        'ERROR_FILE_NOT_FILEPATH': '未提供保存目录',
        'ERROR_WRITE_CONTENT': '写入文件错误',
        'ERROR_UNKNOWN': '未知错误'
    }

    @classmethod
    def randomString(cla, randomlength = 8):
        str = ''
        chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
        length = len(chars) - 1
        random = Random()
        for i in range(randomlength):
            str+=chars[random.randint(0, length)]
        return str
    
    def __init__(self, fileField, config = None):
        self.__fileField = fileField
        self.__config = config or {}
        self.__uploadFile = None
        self.__stateInfo = None
        self.__name = None
        self.__size = None
        self.__upFile()

    def getFileInfo(self):
        if self.__stateInfo == 'SUCCESS':
            return {'state': self.__stateInfo, 'name': self.__newName, 'path': self.__filePath,'oldname':self.__name, 'size':self.__size}
        return {'state': self.__stateInfo}

    def __upFile(self):
        uploadFile = self.__uploadFile = request.files.get(self.__fileField)
        if not uploadFile:
            self.__stateInfo = self.__stateMap['ERROR_FILE_NOT_FOUND']
            return False

        self.__fileType = self.__getFileExt(uploadFile)
        self.__newName = self.__getFullName(self.__fileType)
        self.__name = request.values.get('name')
        self.__size = request.values.get('size',0, int)

        if not self.__checkType(self.__fileType):
            self.__stateInfo = self.__stateMap['ERROR_TYPE_NOT_ALLOWED']
            return False

        if not ('filePath' in self.__config) or len(self.__config.get('filePath')) == 0:
            self.__stateInfo = self.__stateMap['ERROR_FILE_NOT_FILEPATH']
            return False

        self.__filePath = self.__config.get('filePath')

        if self.__filePath[-1] != os.sep:
            self.__filePath = self.__filePath + os.sep

        try:
            self.__uploadFile.save(self.__filePath + self.__newName, buffer_size = 1638400)
            self.__stateInfo = self.__stateMap['SUCCESS']
        except Exception as e:
            self.__stateInfo = self.__stateMap['ERROR_FILE_MOVE']
            print(e)

    def __checkType(self, type):
        if not 'allowFiles' in self.__config:
            self.__config['allowFiles'] = []
        return type in self.__config['allowFiles']

    def __getFullName(self, type):
        if 'fileName' in self.__config:
            return '%s.%s' % (self.__config.get('fileName'), type)
        return '%s.%s' % (str(int(time.time()))+Uploader.randomString(8), str(type))

    def __getFileExt(self, uploadFile):
        fileName = secure_filename(uploadFile.filename)
        return fileName[(fileName.rfind('.', 0, len(fileName)) + 1):len(fileName)]

file_path = "xxx"
uploader = Uploader("file", {"filePath": file_path, "allowFiles": ["jpg", "jpeg", "png", "gif"]})
上一篇下一篇

猜你喜欢

热点阅读