This commit is contained in:
ValueOn AG 2025-09-02 11:47:43 +02:00
commit 617f07aae3
2 changed files with 48 additions and 19 deletions

View file

@ -350,6 +350,9 @@ class ComponentObjects:
# If fileName is provided, check for exact name+hash match first # If fileName is provided, check for exact name+hash match first
if fileName: if fileName:
for file in accessibleFiles: for file in accessibleFiles:
# Skip files without fileName key or with None/empty fileName
if "fileName" not in file or not file["fileName"]:
continue
if file["fileName"] == fileName: if file["fileName"] == fileName:
return FileItem( return FileItem(
id=file["id"], id=file["id"],
@ -361,16 +364,24 @@ class ComponentObjects:
creationDate=file["creationDate"] creationDate=file["creationDate"]
) )
# Return first file with matching hash (for general duplicate detection) # Return first valid file with matching hash (for general duplicate detection)
return FileItem( for file in accessibleFiles:
id=accessibleFiles[0]["id"], # Skip files without fileName key or with None/empty fileName
mandateId=accessibleFiles[0]["mandateId"], if "fileName" not in file or not file["fileName"]:
fileName=accessibleFiles[0]["fileName"], continue
mimeType=accessibleFiles[0]["mimeType"], # Use first valid file
fileHash=accessibleFiles[0]["fileHash"], return FileItem(
fileSize=accessibleFiles[0]["fileSize"], id=file["id"],
creationDate=accessibleFiles[0]["creationDate"] mandateId=file["mandateId"],
) fileName=file["fileName"],
mimeType=file["mimeType"],
fileHash=file["fileHash"],
fileSize=file["fileSize"],
creationDate=file["creationDate"]
)
# If no valid files found, return None
return None
def getMimeType(self, fileName: str) -> str: def getMimeType(self, fileName: str) -> str:
"""Determines the MIME type based on the file extension.""" """Determines the MIME type based on the file extension."""
@ -454,15 +465,23 @@ class ComponentObjects:
fileItems = [] fileItems = []
for file in filteredFiles: for file in filteredFiles:
try: try:
# Ensure proper values, use defaults for invalid data
creationDate = file.get("creationDate")
if creationDate is None or not isinstance(creationDate, (int, float)) or creationDate <= 0:
creationDate = get_utc_timestamp()
fileName = file.get("fileName")
if not fileName or fileName == "None":
continue # Skip records with invalid fileName
fileItem = FileItem( fileItem = FileItem(
id=file.get("id"), id=file.get("id"),
mandateId=file.get("mandateId"), mandateId=file.get("mandateId"),
fileName=file.get("fileName"), fileName=fileName,
mimeType=file.get("mimeType"), mimeType=file.get("mimeType"),
workflowId=file.get("workflowId"),
fileHash=file.get("fileHash"), fileHash=file.get("fileHash"),
fileSize=file.get("fileSize"), fileSize=file.get("fileSize"),
creationDate=file.get("creationDate") creationDate=creationDate
) )
fileItems.append(fileItem) fileItems.append(fileItem)
except Exception as e: except Exception as e:
@ -511,6 +530,9 @@ class ComponentObjects:
# Check if fileName exists (excluding the current file if updating) # Check if fileName exists (excluding the current file if updating)
for file in files: for file in files:
# Skip files without fileName key or with None/empty fileName
if "fileName" not in file or not file["fileName"]:
continue
if file["fileName"] == fileName and (excludeFileId is None or file["id"] != excludeFileId): if file["fileName"] == fileName and (excludeFileId is None or file["id"] != excludeFileId):
return False return False
return True return True
@ -544,9 +566,12 @@ class ComponentObjects:
fileSize = len(content) fileSize = len(content)
fileHash = hashlib.sha256(content).hexdigest() fileHash = hashlib.sha256(content).hexdigest()
# Ensure mandateId is valid
mandateId = self.currentUser.mandateId or "default"
# Create FileItem instance # Create FileItem instance
fileItem = FileItem( fileItem = FileItem(
mandateId=self.currentUser.mandateId, mandateId=mandateId,
fileName=uniqueName, fileName=uniqueName,
mimeType=mimeType, mimeType=mimeType,
fileSize=fileSize, fileSize=fileSize,

View file

@ -86,13 +86,13 @@ async def upload_file(
) )
# Save file via LucyDOM interface in the database # Save file via LucyDOM interface in the database
fileItem, duplicateType = managementInterface.saveUploadedFile(fileContent, file.fileName) fileItem, duplicateType = managementInterface.saveUploadedFile(fileContent, file.filename)
# Determine response message based on duplicate type # Determine response message based on duplicate type
if duplicateType == "exact_duplicate": if duplicateType == "exact_duplicate":
message = f"File '{file.fileName}' already exists with identical content. Reusing existing file." message = f"File '{file.filename}' already exists with identical content. Reusing existing file."
elif duplicateType == "name_conflict": elif duplicateType == "name_conflict":
message = f"File '{file.fileName}' already exists with different content. Uploaded as '{fileItem.fileName}'." message = f"File '{file.filename}' already exists with different content. Uploaded as '{fileItem.fileName}'."
else: # new_file else: # new_file
message = "File uploaded successfully" message = "File uploaded successfully"
@ -110,7 +110,7 @@ async def upload_file(
"message": message, "message": message,
"file": fileMeta, "file": fileMeta,
"duplicateType": duplicateType, "duplicateType": duplicateType,
"originalFileName": file.fileName, "originalFileName": file.filename,
"storedFileName": fileItem.fileName, "storedFileName": fileItem.fileName,
"isDuplicate": duplicateType != "new_file" "isDuplicate": duplicateType != "new_file"
}) })
@ -315,11 +315,15 @@ async def download_file(
) )
# Return file as response # Return file as response
# Properly encode filename for Content-Disposition header to handle Unicode characters
import urllib.parse
encoded_filename = urllib.parse.quote(fileData.fileName)
return Response( return Response(
content=fileContent, content=fileContent,
media_type=fileData.mimeType, media_type=fileData.mimeType,
headers={ headers={
"Content-Disposition": f"attachment; fileName={fileData.fileName}" "Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}"
} }
) )
except HTTPException: except HTTPException: