From b90e9ac7249136fdaf243909472fdc84511bfb91 Mon Sep 17 00:00:00 2001 From: Michael Grote Date: Thu, 13 Apr 2023 11:29:47 +0200 Subject: fix download --- app.py | 123 ++++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 51 deletions(-) (limited to 'app.py') diff --git a/app.py b/app.py index f6532d2..14ba9a6 100644 --- a/app.py +++ b/app.py @@ -1,58 +1,78 @@ import os -from flask import Flask, request, jsonify, send_file, render_template +from flask import Flask, request, redirect, url_for, send_from_directory, abort +from werkzeug.utils import secure_filename -app = Flask(__name__) - -UPLOAD_DIRECTORY = os.environ.get("UPLOAD_DIRECTORY", "./uploads") -UPLOAD_TOKEN = os.environ.get("UPLOAD_TOKEN") - -@app.route("/upload", methods=["POST"]) -def upload(): - if UPLOAD_TOKEN and "Token" not in request.headers: - return jsonify({"message": "No upload token provided"}), 401 - - token = request.headers.get("Token") - if UPLOAD_TOKEN and token != UPLOAD_TOKEN: - return jsonify({"message": "Invalid upload token"}), 401 - - if "file" not in request.files: - return jsonify({"message": "No file found"}), 400 - - file = request.files["file"] - if file.filename == "": - return jsonify({"message": "No file found"}), 400 +UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/app/uploads') +ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} - if not os.path.exists(UPLOAD_DIRECTORY): - os.makedirs(UPLOAD_DIRECTORY) - - file.save(os.path.join(UPLOAD_DIRECTORY, file.filename)) - - return jsonify({"message": "File saved successfully"}), 200 - -@app.route("/download/", methods=["GET"]) -def download(filename): - file_path = os.path.join(UPLOAD_DIRECTORY, filename) - if not os.path.exists(file_path): - return jsonify({"message": "File not found"}), 404 +app = Flask(__name__) +app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER - return send_file(file_path, as_attachment=True) +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS -@app.route("/", methods=["GET"]) +@app.route('/') def index(): - files = [] - for filename in os.listdir(UPLOAD_DIRECTORY): - filepath = os.path.join(UPLOAD_DIRECTORY, filename) - if os.path.isfile(filepath): - files.append({"name": filename, "size": os.path.getsize(filepath)}) - return render_template("index.html", files=files) - -@app.route("/metrics", methods=["GET"]) -def metrics(): - files = os.listdir(UPLOAD_DIRECTORY) - file_count = len(files) - total_size = sum(os.path.getsize(os.path.join(UPLOAD_DIRECTORY, f)) for f in files) - file_list = [{"name": f, "size": os.path.getsize(os.path.join(UPLOAD_DIRECTORY, f))} for f in files] - return jsonify({"count": file_count, "total_size": total_size, "files": file_list}), 200 + file_list = os.listdir(app.config['UPLOAD_FOLDER']) + return """ + + + + + File List + + +

File List

+ + + + """ % ''.join(f'
  • {filename}
  • ' for filename in file_list) + +@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('/download/', 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('/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) @@ -62,13 +82,14 @@ def metrics(): # Download # curl -X GET http://docker10.grote.lan:5040/download/filename.ext > filename.ext # List -#$ curl -X GET http://docker10.grote.lan:5040/files +# curl -X GET http://docker10.grote.lan:5040/files # Metriken # curl -X GET http://docker10.grote.lan:5040/metrics - +# upload check +# download # farben im putput weg # wsgi server -- cgit v1.2.3