diff --git a/files/files.py b/files/files.py index 31f1f4c..10397fd 100644 --- a/files/files.py +++ b/files/files.py @@ -1,4 +1,6 @@ import os +import random +import hashlib from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, \ send_from_directory, g @@ -16,9 +18,20 @@ bp.add_url_rule('/uploads/', 'uploaded_file', build_only=True) def _get_extension(filename): return filename.rsplit('.', 1)[1].lower() +def _get_name(filename): + return filename.rsplit('.', 1)[0].lower() + def _get_path_in_upload(filename): return os.path.join(current_app.config['UPLOAD_FOLDER'], filename) + + +def _get_unused_name(filename): + if os.path.exists(_get_path_in_upload(filename)): + filename = f'{_get_name(filename)}{random.randint(0,9)}.{_get_extension(filename)}' + return _get_unused_name(filename) + else: + return filename def _save_file(file, private, category, file_type): @@ -27,7 +40,10 @@ def _save_file(file, private, category, file_type): else: is_private = 1 - filename = secure_filename(file.filename) + filename = secure_filename(_get_unused_name(file.filename)) + + if os.path.exists(_get_path_in_upload(filename)): + abort(500) file.save(_get_path_in_upload(filename)) f = File(filename, is_private, category.id, file_type.id) @@ -35,9 +51,11 @@ def _save_file(file, private, category, file_type): db.session.add(f) db.session.commit() + return f + def _rename_file(file, new_name): - new_name = secure_filename(new_name) + new_name = secure_filename(_get_unused_name(new_name)) os.rename(_get_path_in_upload(file.filename), _get_path_in_upload(new_name)) file.filename = new_name