Fügen Sie eine input-Datei mit JSF 1.2
Ich hochladen müssen in einer form gewidmet, um Dateien hochladen. In meinem Projekt, das ich verwenden kann, JSF 1.2 und RichFaces 3.3.3, aber ich kann nicht in der <rich:fileUpload/>
weil mein Kunde will eine einfache Eingabe, genau wie <input type="file"/>
.
Wenn ich könnte würde ich Primeface oder Tomahawk-Datei hochladen, aber ich bin mir verboten, ich kann nicht mit anderen Bibliotheken, kann ich auch nicht verwenden, Servlet 3.0 nether Apache fileupload. Was kann ich jetzt tun? Ich habe gesehen, ähnliche Fragen, aber Sie könnten damit anderen libs, ich kann einfach nicht, ich bin beschränkt...
- Warum nach unten Stimmen? Kommentar, anstatt nach unten zu Stimmen und zu Fuß entfernt
- Es würde am einfachsten sein, verwenden Sie ein 3rd-party-Kontrolle oder der Bibliothek. Da dies nicht eine option, die Sie haben, um es zu Lesen der MIME-Spezifikation, wie Sie gehen, um sein schreiben ein MIME-parser.
- ja ich weiß, es wäre waaay einfacher, ich habe auch eine version mit einer lib und es wurde abgelehnt :/ ich bin versucht derzeit, verwenden Sie ein servlet, um die Datei zu empfangen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist schon einige Zeit her, ich hatte zu schreiben, ein MIME-parser für JSF, aber das ist, was ich erinnere mich, über den Prozess.
Benötigen Sie zum schreiben eines parsers zum extrahieren von Daten aus der
multi-part/formdata
Nutzlast. Es ist eine gute übersicht der- multi-part/formdata
auf die W3 site.Müssen Sie entscheiden, ob Sie zum Ziel:
Ausrichtung einer einfachen servlet -
Wird dies der einfachere Weg, so lange, wie der upload-POST-Aktion gar nicht brauchen, aufrufen von code, die sich in einer JSF-Kontext (managed beans, etc.)
Ihre servlet analysiert die Daten aus dem Eingabe-stream und handelt entsprechend.
Die Ausrichtung auf eine JSF-view/action
Hier müssen Sie verziert die Anfrage (am besten mit einem
HttpServletRequestWrapper
), um die analysiert Parameter dem JSF-framework. Dies würde in der Regel erfolgen in einem filter erkennt, dass die post-Typ aus dem HTTP-Header. Entscheidungen müssen darüber getroffen werden, wo die Daten der Datei gespeichert wird, bevor der Aufruf einer Formular-Aktionen und wie du gehst zu setzen, dass die Daten auf managed beans.Sie müssen auch prüfen, ob Sie zum erstellen einer benutzerdefinierten JSF-Steuerung für die Datei hochladen input type oder ob Sie Weg erhalten können mit einfachen HTML-Elementen.
Es lohnt sich zu untersuchen, die Merkmale der Parser/Steuerelemente, die Sie nicht verwenden können, um sicherzustellen, dass Sie bieten einfache features, wie eine maximale payload-Größe zu verhindern, dass Angreifer das hochladen Gigabyte an Daten auf Ihre Bewerbung.
org.ajax4jsf.request.MultipartRequest
), so brauche ich nicht zu implementieren, die es von mir selbst 🙂Um dieses Problem zu lösen mit einem akzeptablen Lösung ich habe ein normales Formular und ein servlet das servlet empfängt die
multipart/form-data
Anfrage und verwendet denorg.ajax4jsf.Anfrage.MultipartRequest
enthalten in RichFaces 3.3.3, die zum analysieren der empfangenen Parameter und die angehängte Datei, dann Speichere ich dieFile
Instanz in einer Sitzung und ich es wiederherstellen innerhalb des JSF-Kontext.xhtml:
Servlet:
Controller:
Hatte ich zuvor vor dem gleichen Problem. Ich löste das Problem, indem Sie das öffnen von pop-up, wenn Benutzer klicken Sie auf die Schaltfläche durchsuchen, und diese neue popup-wurde direkt mit einem servlet unterstützt, die die Dateien hochladen und herunterladen.
Sobald eine Datei hochgeladen wurde das pop-up geschlossen wurde, die direkt von der servlet-Aufruf-Fenster.close() beim laden der Körper-servlet.
nachfolgend sind die änderungen erledigt:
Im addItem.jsp, die fordert Benutzer für eine Datei :
In der neuen pop-up-Fenster, das geöffnet wurde : addItemImage.jsp
Dies würde die post an ein servlet, das würde dann Rendern Sie das Bild und speichern Sie es an einem Ort.
FileUploaderServlet.java
Dieses servlet nach der Fertigstellung speichern der Datei an einem Ort konfiguriert, würde direkt schließen Sie das pop-up, das zuvor geöffnet.
Also auf diese Weise war ich in der Lage zur Nutzung der managed-bean, jsf 1.2 und erreichen, fiel hochladen.
Ich fand andere Wege, auf stackoverflow aber gefühlt war es ein bisschen komplexer zu implementieren.