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,}