Dateiuploads aus Formularen werden normalerweise nur als Attachment verschickt, werden serverseitig aber nicht gespeichert - wir zeigen wie Sie dies mit wenig Aufwand ändern können. Interessant ist die z.B. für ein »Call for Paper«, Sie sammeln zentral in Plone alle Dokumente ein.
Voraussetzung
Sie benötigen ein Formular, das ein Feld für den Dateiupload enthält, das Formular sollte in einem eigenen Ordner liegen.
Legen Sie zuerst im Ordner in dem das Formular liegt einen neuen Ordner an und nennen diesen »uploads«. Wichtig ist, dass Sie diesen Ordner im Status auf »privat« stehen lassen und nicht veröffentlichen. So ist sichergestellt, dass nur Sie Zugriff auf die hochgeladenen Dokumente haben.
Legen Sie als nächstes innerhalb des Formulars einen »Adapter für ein eigenes Script« an.
In das Feld Scrip-Rumpf kommen folgende Code-Zeilen, die Zeilen sind kommentiert - bei Bedarf können Sie hier auch eigene Anpassungen vornehmen.
formFile = request.form['foto_file']
# foto_file -> foto ist dabei die ID des Ordners,
tragen Sie hier bitte die ID des Dateifeldes ein, unbedingt _file nicht löschen oder ändern
#"uploads" ist die ID des Ordners der paralel zum FormGen Ordner liegt -
hier werden die Dateien abgelegt
uploadFolder = getattr(ploneformgen.getParentNode(),'uploads')
#Hier kann der Dateiname angegeben werden.
formFileName = 'File-'+ str(DateTime().strftime('%Y-%m-%d-%H-%M'))
#Hier wird das Plone Objekt erzeugt.
uploadFolder.invokeFactory('File',id=formFileName, file=formFile)
Ab jetzt werden alle hochgeladenen Dateien in den Ordner »uploads« gespeichert. Die Dateien erhalten eindeutige Dateinamen nach dem Muster Uploadname-Zeitstempel - so sind auch Uploads mit identischen Dateinamen ohne Konflikte möglich.
Wir hatten in einem Institut den Fall, dass als führende ID beim Anlegen der Datei in Plone das Feld Matrikelnummer verwendet wurde, damit brach der Vorgang ab, wenn das Formular unter einer Matrikelnummer mehrfach abgeschickt werden sollte. Nachfolgender Codeblock ergänzt die Funktion um eine Überprüfung ob die Datei im Upload-Ordner schon existiert:
picture = request.form['foto_file']
matNummer = request.form['matrikelnummer']
#"uploads" ist die ID des Ordners der paralel zum FormGen Ordner liegt - hier werden die Dateien abgelegt
uploadFolder = getattr(ploneformgen.getParentNode(),'uploads')
#Hier kann der Dateiname angegeben werden.
formFileName = matNummer
#Hier wird das Plone Objekt erzeugt.
nid = formFileName
c = 0
while hasattr(uploadFolder,nid):
c += 1
nid = formFileName + '-' + str(c)
uploadFolder.invokeFactory('File',id=nid,file=picture)