flask-upload 文件上传

settings.py

# -*- coding: utf-8 -*-

def get_database_uri(DATABASE):
    dialect = DATABASE.get('dialect') or 'mysql'
    mysql = DATABASE.get('mysql') or 'pymysql'
    username = DATABASE.get('username') or 'root'
    password = DATABASE.get('password') or '123456'
    host = DATABASE.get('host') or 'localhost'
    port = DATABASE.get('port') or '3306'
    db = DATABASE.get('db') or 'Shopping'
    return '{}+{}://{}:{}@{}:{}/{}'.format(dialect,mysql,username,password,host,port,db)


class Config():
    TEST = False
    DEBUG = False
    SECRET_KEY = '110'
    # SESSION_TYPE = 'redis'
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    #制定图片存放位置
    UPLOAD_FOLDER = "s/static"
    THUMBNAIL_FOLDER = "s/thumb"
    #上传服务器换成相应的地址
    UPLOADS_DEFAULT_URL = 'http://127.0.0.1:5000/'


class DevelopConfing(Config):
    DEBUG = True
    DATABASE = {
        'dialect':'mysql',
        'mysql':'pymysql',
        'username':'root',
        'password':'123456',
        'host':'localhost',
        'port':'3306',
        'db':'Shopping'
    }
    SQLALCHEMY_DATABASE_URI=get_database_uri(DATABASE)

env = {
    'develop':DevelopConfing
}

manager.py

# -*- coding: utf-8 -*-

from flask_migrate import MigrateCommand
from flask_script import Manager
from App import create_app
from flask import Flask, request
import traceback
from PIL import Image
import os
from uploadfile import uploadfile
import json


app = create_app('develop')
manager = Manager(app=app)
manager.add_command('db',MigrateCommand)

ALLOWED_EXTENSIONS = set(['gif', 'png', 'jpg', 'jpeg', 'bmp', 'mp4', 'ogg', 'pdf'])
IGNORED_FILES = set(['.gitignore'])




def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


def gen_file_name(filename):
    """
    If file was exist already, rename it and return a new name
    """

    i = 1
    while os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
        name, extension = os.path.splitext(filename)
        filename = '%s_%s%s' % (name, str(i), extension)
        i += 1

    return filename


def create_thumbnail(image):
    try:
        base_width = 80
        img = Image.open(os.path.join(app.config['UPLOAD_FOLDER'], image))
        w_percent = (base_width / float(img.size[0]))
        h_size = int((float(img.size[1]) * float(w_percent)))
        img = img.resize((base_width, h_size), Image.ANTIALIAS)
        img.save(os.path.join(app.config['THUMBNAIL_FOLDER'], image))

        return True

    except:
        print(traceback.format_exc())
        return False



def create_app(cfg_cls):
    app = Flask(__name__, static_folder="s")
    app.config.from_object(cfg_cls)



@app.route("/api/upload/", methods=['GET', 'POST'])
def uploads():

    if request.method == 'POST':
        print(request.files)
        files = request.files['file']


        if files:
            # filename = secure_filename(files.filename)
            filename = files.filename
            filename = gen_file_name(filename)
            mime_type = files.content_type

            if not allowed_file(files.filename):
                result = uploadfile(name=filename, type=mime_type, size=0, not_allowed_msg="File type not allowed")

            else:
                # save file to disk
                uploaded_file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
                files.save(uploaded_file_path)

                # create thumbnail after saving
                if mime_type.startswith('image'):
                    create_thumbnail(filename)

                # get file size after saving
                size = os.path.getsize(uploaded_file_path)

                # return json for js call back
                result = uploadfile(name=filename, type=mime_type, size=size)

            return json.dumps({"files": [result.get_file()]})

    if request.method == 'GET':
        # get all file in ./data directory
        files = [f for f in os.listdir(app.config['UPLOAD_FOLDER']) if
                 os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], f)) and f not in IGNORED_FILES]

        file_display = []

        for f in files:
            size = os.path.getsize(os.path.join(app.config['UPLOAD_FOLDER'], f))
            file_saved = uploadfile(name=f, size=size)
            file_display.append(file_saved.get_file())

        return json.dumps({"files": file_display})


@app.route("/upload/<filename>", methods=["DELETE"])
def delete_upload(filename: str):
    filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    thumbnailpath = os.path.join(app.config['THUMBNAIL_FOLDER'], filename)
    os.path.exists(filepath) and os.remove(filepath)
    os.path.exists(thumbnailpath) and os.remove(thumbnailpath)
    return "ok"



if __name__ == "__main__":
    #manager.run()
    app.run(port=5000, host="0.0.0.0")

uploadfile.py

# -*- coding: utf-8 -*-

import os
from flask import current_app
class uploadfile():
    def __init__(self, name, type=None, size=None, not_allowed_msg=''):
        self.name = name
        self.type = type
        self.size = size
        self.not_allowed_msg = not_allowed_msg
        self.url = "/%s/%s" % (current_app.config['UPLOAD_FOLDER'], name)
        self.thumbnail_url = "/%s/%s" % (current_app.config['THUMBNAIL_FOLDER'], name)
        self.delete_url = "upload/%s" % name
        self.delete_type = "DELETE"


    def is_image(self):
        fileName, fileExtension = os.path.splitext(self.name.lower())

        if fileExtension in ['.jpg', '.png', '.jpeg', '.bmp']:
            return True

        return False


    def get_file(self):
        if self.type != None:
            # POST an image
            if self.type.startswith('image'):
                return {"name": self.name,
                        "type": self.type,
                        "size": self.size, 
                        "url": self.url, 
                        "thumbnailUrl": self.thumbnail_url,
                        "deleteUrl": self.delete_url, 
                        "deleteType": self.delete_type,}
            
            # POST an normal file
            elif self.not_allowed_msg == '':
                return {"name": self.name,
                        "type": self.type,
                        "size": self.size, 
                        "url": self.url, 
                        "deleteUrl": self.delete_url, 
                        "deleteType": self.delete_type,}

            # File type is not allowed
            else:
                # return {"error": self.not_allowed_msg,
                #         "name": self.name,
                #         "type": self.type,
                #         "size": self.size,}
                return {"name": self.name,
                        "type": self.type,
                        "size": self.size, 
                        "url": self.url, 
                        "deleteUrl": self.delete_url, 
                        "deleteType": self.delete_type,}

        # GET image from disk
        elif self.is_image():
            return {"name": self.name,
                    "size": self.size, 
                    "url": self.url, 
                    "thumbnailUrl": self.thumbnail_url,
                    "deleteUrl": self.delete_url, 
                    "deleteType": self.delete_type,}
        
        # GET normal file from disk
        else:
            return {"name": self.name,
                    "size": self.size, 
                    "url": self.url, 
                    "deleteUrl": self.delete_url, 
                    "deleteType": self.delete_type,}

猜你喜欢

转载自blog.csdn.net/qq_42336700/article/details/86528958