Dateiupload in Plone

Gute Links und Tutorials könnt ihr hier posten.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Achtung: Viele Bilder! :twisted:

Erstellen Sie zuerst im Plone einen neuen Ordner. Am besten mit dem Namen uploads.

Bild

Gehen Sie danach ins ZMI und erstellen Sie unterhalb des Ordners uploads den Ordner daten. Diesmal im ZMI mit dem Objekttyp Folder. Das verhindert auf einfache Art, dass der Ordner mit den Daten von Plone aus gesehen wird.

Bild

Erstellen Sie im Ordner uploads eine Controller Page Template mit dem Namen index_html. Dieser Name bestimmt, dass diese Datei die Hauptdatei dieses Ordners ist und der Type Controller Page Template ist eine erweiterte Seitenvorlage, die speziell für Formulare gemacht wurde. Sie enthält im ZMI zusätzlich die Karteikarten Validation und Actions. In denen kann man bestimmen, welche Skripte zum Prüfen herangezogen werden und welche Aktionen bei Erfolg oder Misserfolg der Prüfungen durchgeführt werden sollen.

Bild

Als Vorlage für Seitenvorlagen verwende ich gerne portal_skins/plone_content/document_view. Bei dieser Vorlage muss man kaum mehr etwas anpassen.

Die fertige Seite sieht dann so aus:

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">
<body>

<metal:main fill-slot="main">
  <tal:main-macro metal:define-macro="main">

    <div metal:use-macro="here/document_actions/macros/document_actions">
        Document actions (print, sendto etc)
    </div>

    <h1 class="documentFirstHeading">
      Uploadformular
    </h1>

    <p class="documentDescription">
      In diesem Formular koennen Sie ein Bild oder eine andere
      Datei hochladen. Diese Datei wird dann hier in einer Liste
      angezeigt.
    </p>

    <p> </p>

    <!-- Uploadformular BEGIN -->
    <form method="post"
          enctype="multipart/form-data"
          tal:attributes="action template/id"
    >

      <div class="field">
        <label>
          Datei zum Hochladen:
        </label>
        <span class="fieldRequired" title="Required">(Required)</span>
        <div class="formHelp">
          Geben Sie hier den Pfad zur Datei an, die hochgeladen werden soll.
        </div>
        <input type="file" name="datei" />
      </div>

      <input type="submit" name="form.button.hochladen" value="Abschicken" />

      <input type="hidden" name="form.submitted" value="1" />

    </form>
    <!-- Uploadformular END -->

    <p> </p>

    <!-- Dateiliste BEGIN -->
    <ul tal:define="file_ids python: container.daten.objectIds('File')">
      <li tal:repeat="file_id file_ids">
        <a href=""
           tal:content="file_id"
           tal:attributes="href python:container.daten[file_id].absolute_url()"
        >[File]</a>
      </li>
    </ul>
    <!-- Dateiliste END -->


    <div metal:use-macro="here/document_relateditems/macros/relatedItems">
        show related items if they exist
    </div>

  </tal:main-macro>
</metal:main>

</body>
</html>
Jetzt muss noch ein Skript erstellt werden, das beim Absenden des Formulars aufgerufen wird. Erstellen Sie dafür ein neues Objekt vom Typ Controller Python Script. Dabei handelt es sich um ein erweitertes Python-Skript, speziell zur Verarbeitung von Formulardaten. Als Dateinamen geben Sie hier für das Beispiel bitte upload an.

Bild

So sieht unser fertiges Upload-Skript aus:

Code: Alles auswählen

datadir = container.daten

if datei:
    new_file = datadir.manage_addFile(
        id = datei.filename,
        file = datei,
    )
    message = "Datei wurde hochgeladen"
else:
    message = "Die Datei wurde NICHT hochgeladen"

state.setKwargs({"portal_status_message": message})
return state
Achten Sie bitte darauf, dass auch ein Parameter übergeben wird. In unserem Fall datei. Siehe Bild:

Bild

Wichtiger Hinweis! Das Skript fängt keine Fehler ab und auf Validatoren gehe ich auch nicht ein. Alles weitere erfahren Sie im Plone Buch von Andy McKay im Kapitel 6.4 (Formulare verwenden).

http://docs.neuroinf.de/PloneBook/ch6.rst#using-forms

Jetzt müssen die beiden Dateien miteinander verbunden werden. Das geschieht über die jeweiligen Action-Reiter.

Öffnen Sie im ZMI die Datei index_html und klicken Sie auf den Action-Reiter.

Bild

Das sieht, wenn es fertig ist so aus:

Bild

Jetzt geht es mit der Action des Skripts upload weiter. Öffnen Sie im ZMI die Datei upload und klicken Sie auf den Action-Reiter.

Bild

Das sieht, wenn es fertig ist so aus:

Bild

Und das ist das Ergebnis:

Bild

Hier ist die Rohfassung: http://gerold.bcom.at/bilder/dateiupload_in_plone.txt

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold,

danke für die Anleitung. Funktioniert, hat aber glaube ich einen Fehler.
Im Script steht

Code: Alles auswählen

new_file = datadir.manage_addFile(id = datei.filename, file = datei)
Hierbei ist datei.filename der komplette Dateipfad, welcher durch Doppelpunkte oder Slashes nicht als Id taugt.

Ich habe das Script upload folgendermaßen angepasst:

Code: Alles auswählen

datadir = container.daten 

def dateiname(pfad):
  if pfad:
    maxindex = pfad.rfind('\\')
    if maxindex < 0:
      maxindex = pfad.rfind('/')

    if maxindex > 0:
      datei = pfad[maxindex + 1:]
    else:
      datei = pfad

    return datei


id = dateiname(datei.filename)

if datei:
  try: 
    new_file = datadir.manage_addFile(id = id, file = datei) 
    message = 'Datei wurde hochgeladen'
  except:
    message = 'Die Datei wurde NICHT hochgeladen'
else: 
    message = 'Die Datei wurde NICHT hochgeladen'

state.setKwargs({"portal_status_message": message}) 
return state
Grüße JR

P.S.: Jetzt versuche ich gleich mal, dass mir die hochgeladenen Bilder in einem Fensterchen angezeigt werden :-)
6run0
User
Beiträge: 1
Registriert: Montag 28. März 2011, 11:33

hi all
vielen dank für die anleitung. bin ihr gefolgt und bin zuversichtlich, dass es funktionieren wird. nur ohne bilder weiß ich nicht, was ich bei den actions mach, besonders bei den argumenten.
kann jemand helfen?
lg, sebastian.
Antworten