fix upload

This commit is contained in:
Michael Grote 2023-04-13 11:34:16 +02:00
parent b90e9ac724
commit 23094c6981
2 changed files with 46 additions and 66 deletions

110
app.py
View file

@ -1,79 +1,59 @@
import os
from flask import Flask, request, redirect, url_for, send_from_directory, abort
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/app/uploads')
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
import uuid
from flask import Flask, request, jsonify, send_from_directory, render_template
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
UPLOAD_DIRECTORY = os.environ.get("UPLOAD_DIRECTORY", "/uploads")
if not os.path.exists(UPLOAD_DIRECTORY):
os.makedirs(UPLOAD_DIRECTORY)
UPLOAD_TOKEN = os.environ.get("UPLOAD_TOKEN")
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
return True
@app.route('/')
@app.route("/")
def index():
file_list = os.listdir(app.config['UPLOAD_FOLDER'])
return """
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>File List</title>
</head>
<body>
<h1>File List</h1>
<ul>
%s
</ul>
</body>
</html>
""" % ''.join(f'<li><a href="/download/{filename}">{filename}</a></li>' for filename in file_list)
files = []
for filename in os.listdir(UPLOAD_DIRECTORY):
path = os.path.join(UPLOAD_DIRECTORY, filename)
if os.path.isfile(path):
files.append({"filename": filename, "size": os.path.getsize(path)})
total_size = sum(f["size"] for f in files)
return render_template("index.html", files=files, total_size=total_size, count=len(files))
@app.route('/upload', methods=['POST'])
def upload_file():
# check if the post request has the file part
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
# if user does not select file, browser also
# submit an empty part without filename
if file.filename == '':
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return 'file uploaded successfully'
else:
return 'invalid file type'
@app.route("/upload", methods=["POST"])
def upload():
if "file" not in request.files:
return "No file found", 400
file = request.files["file"]
if file.filename == "":
return "No file selected", 400
if not allowed_file(file.filename):
return "Invalid file type", 400
if UPLOAD_TOKEN and request.headers.get("Authorization") != f"Bearer {UPLOAD_TOKEN}":
return "Unauthorized", 401
filename = str(uuid.uuid4())
file.save(os.path.join(UPLOAD_DIRECTORY, filename))
return jsonify({"filename": filename})
@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
try:
return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)
except FileNotFoundError:
abort(404)
@app.route("/download/<filename>", methods=["GET"])
def download(filename):
return send_from_directory(UPLOAD_DIRECTORY, filename)
@app.route('/metrics', methods=['GET'])
def get_metrics():
file_list = os.listdir(app.config['UPLOAD_FOLDER'])
file_count = len(file_list)
total_size = 0
for filename in file_list:
total_size += os.path.getsize(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return {
'file_count': file_count,
'total_size': total_size,
'files': [{
'name': filename,
'size': os.path.getsize(os.path.join(app.config['UPLOAD_FOLDER'], filename))
} for filename in file_list]
}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5040, debug=True)
@app.route("/metrics")
def metrics():
files = []
for filename in os.listdir(UPLOAD_DIRECTORY):
path = os.path.join(UPLOAD_DIRECTORY, filename)
if os.path.isfile(path):
files.append({"filename": filename, "size": os.path.getsize(path)})
total_size = sum(f["size"] for f in files)
return jsonify({"count": len(files), "total_size": total_size, "files": files})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5040, debug=True)

View file

@ -1,7 +1,7 @@
version: '3'
services:
python-api-server:
image: quotengrote/python-api-server
image: quotengrote/python-api-server:latest
ports:
- "5040:5000"
volumes: