49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
|
|
ALLOWED_IMAGE_EXTENSIONS = {"svg", "png", "jpg", "jpeg", "webp"}
|
||
|
|
|
||
|
|
MAX_FILE_SIZE_MB = 5
|
||
|
|
MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024
|
||
|
|
|
||
|
|
|
||
|
|
def validate_image_file(file):
|
||
|
|
"""
|
||
|
|
Validate file ảnh trước khi upload lên MinIO/S3.
|
||
|
|
|
||
|
|
Hàm này kiểm tra:
|
||
|
|
1. Có file được gửi lên không
|
||
|
|
2. File có tên không
|
||
|
|
3. File có extension không
|
||
|
|
4. Extension có hợp lệ không
|
||
|
|
5. File có vượt quá dung lượng cho phép không
|
||
|
|
|
||
|
|
Trả về:
|
||
|
|
- extension của file nếu hợp lệ
|
||
|
|
|
||
|
|
Raise:
|
||
|
|
- ValueError nếu file không hợp lệ
|
||
|
|
"""
|
||
|
|
|
||
|
|
if file is None:
|
||
|
|
raise ValueError("No file uploaded")
|
||
|
|
|
||
|
|
if file.filename == "":
|
||
|
|
raise ValueError("Filename is empty")
|
||
|
|
|
||
|
|
if "." not in file.filename:
|
||
|
|
raise ValueError("File must have an extension")
|
||
|
|
|
||
|
|
extension = file.filename.rsplit(".", 1)[1].lower()
|
||
|
|
|
||
|
|
if extension not in ALLOWED_IMAGE_EXTENSIONS:
|
||
|
|
raise ValueError("Invalid image type. Allowed: svg, png, jpg, jpeg, webp")
|
||
|
|
|
||
|
|
# Di chuyển con trỏ file tới cuối để đo dung lượng file.
|
||
|
|
file.seek(0, 2)
|
||
|
|
file_size = file.tell()
|
||
|
|
|
||
|
|
# Đưa con trỏ file về đầu để lát nữa upload không bị mất dữ liệu.
|
||
|
|
file.seek(0)
|
||
|
|
|
||
|
|
if file_size > MAX_FILE_SIZE_BYTES:
|
||
|
|
raise ValueError(f"File size must be less than {MAX_FILE_SIZE_MB}MB")
|
||
|
|
|
||
|
|
return extension
|