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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user