Se creo comprobacion para nombres de archivos

Detecte un bug, donde al subirse un archivo nuevo, y este teniendo por
nombre de archivo uno que ya existia internamente, este seria
sobreescrito y de todas formas se insertaba a la base de datos una nueva fila, siendo esta duplicada de la vez anterior.

Por este error se creo una funcion que genera un nombre sin usar
agregando un numero aleatorio al final del nombre del archivo, esto de
forma recursiva, porque... me nacio.
This commit is contained in:
Daniel Cortes
2019-03-12 01:49:02 -03:00
parent 77c901f4f0
commit 2268a524dc

View File

@@ -1,4 +1,6 @@
import os import os
import random
import hashlib
from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, \ from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, \
send_from_directory, g send_from_directory, g
@@ -16,18 +18,32 @@ bp.add_url_rule('/uploads/<path:filename>', 'uploaded_file', build_only=True)
def _get_extension(filename): def _get_extension(filename):
return filename.rsplit('.', 1)[1].lower() return filename.rsplit('.', 1)[1].lower()
def _get_name(filename):
return filename.rsplit('.', 1)[0].lower()
def _get_path_in_upload(filename): def _get_path_in_upload(filename):
return os.path.join(current_app.config['UPLOAD_FOLDER'], 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): def _save_file(file, private, category, file_type):
if private is None: if private is None:
is_private = 0 is_private = 0
else: else:
is_private = 1 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)) file.save(_get_path_in_upload(filename))
f = File(filename, is_private, category.id, file_type.id) 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.add(f)
db.session.commit() db.session.commit()
return f
def _rename_file(file, new_name): 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)) os.rename(_get_path_in_upload(file.filename), _get_path_in_upload(new_name))
file.filename = new_name file.filename = new_name