Tipps & Tricks - Gesamtgröße aller Dateien in einem Dateifeld




In einer Applikation gibt es eine Dateiauswahl, über die der Benutzer im Browser Dateien hochladen kann. Nun sollen weitere Informationen über die angehängten Dateien bereitgestellt werden, wie z.B. die Dateigröße oder die Anzahl der Dateien.

Voraussetzungen




Beim Erstellen der Dateiauswahl wurde in den Eigenschaften angegeben, dass das Hochladen mehrerer Dateien pro Datensatz erlaubt sind.



Zusätzlich werden in der Datengruppe für weitere Informationen zu den Dateien weitere Datenfelder benötigt:

Umsetzung

Im Modul Prozesse wird ein Prozess erstellt, der auf das Einfügen und Ändern eines Datensatzes in der Datengruppe hört. So werden ggf. nachträgliche Änderungen (Hinzufügen und Löschen von Dateien) im Datensatz abgefangen und ausgewertet. An den Datengruppen-Ereignisbehandler wird eine Groovy-Aktion angehängt, die die Dateiinformationen abfragen wird.



In der Groovy-Aktion wird das folgende Skript angewendet:
//Der FileUCHelper muss importiert werden
import de.uplanet.lucy.server.businesslogic.util.FileUCHelper

//nötige Informationen aus dem Datenfeld abfragen
def id= g_record["<GuidRecId>"].value /* datafield (PK) (S) ID <integer> */

def files = FileUCHelper.getFileValueHolder(g_context, "<Guid Dateifeld>", id)
def filesIt = files.getValue()

def intSize = 0
def anz = 0
filesIt.each{element ->
	intSize = intSize + element.getFile().length()
	anz++
}

//Schreibe errechnete Informationen zurück in den Quelldatensatz
def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, """
	UPDATE 
		DATAGROUP('<Guid Datengruppe>') 
	SET 
		L_DATEIGROESSEGESAMT = ?, 
		L_ANZ = ?, 
		FLT_MB = ? 
	WHERE 
		LID = ?""") {
	setInt(1, intSize)
	setInt(2, anz)
	setDouble(3, intSize/1024/1024)
	setInt(4, id)
}

Dokumentationen auf http://docs.intrexx.com:

Der Aufruf des FileUCHelpers mit dem nachfolgenden getValue() wird benötigt, um die im Dateifeld enthaltenen Dateien zu ermitteln. Dann werden die Variablen zum Zählen der Anzahl und der Dateigröße initialisiert und genullt. Es folgt die Schleife (each) über alle gefundenen Dateien. "element" steht für die einzelne Datei, die in der folgenden Zeile mit getFile() abgefragt wird. Mit .length() wird deren Größe in Bytes ausgelesen. anz++ zählt die Laufvariable hoch, die die Anzahl der Dateien darstellt. Es folgt das Zurückschreiben der Informationen, was natürlich auch per sharedState (g_sharedState) und einer folgenden Datengruppenaktion erledigt werden kann. Bei sehr großen Dateien kann es vorkommen, dass die Gesamtgröße der Dateien in Bytes zu groß für ein normales Integer-Datenfeld wird. Eine Fehlermeldung der Datenbank wäre die Folge. Daher ist im Beispiel das Speichern in MB zusätzlich mit angegeben, das sich mit dem entsprechenden Teiler ergibt. Nun werden beim Einfügen und Ändern von Datensätzen in der Applikation die nötigen Daten errechnet und in das Datenfeld geschrieben, das sich z.B. in Ansichtstabellen auf Übersichtsseiten anzeigen lässt.