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:
- Anzahl
- Dateigröße gesamt
- Dateigröße in MB
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 https://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.