6 Stimmen

Verursacht ein Formular mit enctype="multipart/form-data" Probleme beim Zugriff auf ein verborgenes Feld?

Ich habe ein verstecktes Formularelement erstellt

<form name="UploadImage" enctype="multipart/form-data" method="post" action="UploadImage">
    <label>
        </label>
    <input name="imgUploadObjId" id="imgUploadObjId" value="52" type="hidden">

    //rest of the form here

</form>

Und ich versuche, den Wert mit dieser Zeile in einem Servlet zu erhalten (wie ich zuvor getan habe):

int objId = Integer.parseInt(request.getParameter("imgUploadObjId"));

Aber ich bekomme das hier (Zeile 33 ist die Zeile oben):

java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Unbekannte Quelle) java.lang.Integer.parseInt(Unbekannte Quelle) web.objects.UploadImage.doPost(UploadImage.java:33) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Ist etwas anders bei einem Formular mit enctype="multipart/form-data"? Oder können Sie einen anderen Fehler erkennen?

16voto

BalusC Punkte 1034465

Das Servlet parst die Parameter standardmäßig mit application/x-www-form-urlencoded Kodierung. Die Website multipart/form-data Kodierung wird jedoch in Servlets nicht unterstützt, bis Servlet 3.0 . Die getParameter() Anrufe werden alle zurückgeben null .

In Servlet 3.0 hätten Sie [HttpServletRequest#getParts()](http://java.sun.com/javaee/6/docs/api/javax/servlet/http/HttpServletRequest.html#getParts()) um stattdessen alle Teile einer multipart/form-data Anfrage, einschließlich normaler Formularfelder. Vor Servlet 3.0 sollten Sie Apache Commons FileUpload zum Parsen multipart/form-data Anfragen. Siehe auch die folgende Antwort für ein detailliertes Beispiel beider Ansätze: Wie kann man mit JSP/Servlet Dateien auf den Server hochladen?

Beachten Sie, dass Sie, wenn Sie keine <input type="file"> Feld überhaupt, dann können Sie die Kodierung einfach weglassen von der <form> . Es wird dann standardmäßig auf application/x-www-form-urlencoded .

5voto

Als Abhilfe können Sie die erforderlichen verborgenen Parameter auch als GET-Parameter in das Aktionsattribut des Formulars aufnehmen:

<form name="UploadImage" enctype="multipart/form-data" method="post" action="UploadImage?imgUploadObjId=52">

    //rest of the form here

</form>

dies ermöglicht die request.getParameter("imgUploadObjId") Aufruf zur Arbeit.

2voto

Alexander Pogrebnyak Punkte 43705

In der Tat ist da etwas anders.

request.getParameter funktioniert nur für fest kodierte URL-Parameter, die in action Attribut von <form> Element. I

Alle anderen Parameter werden im Formular selbst kodiert, das Sie durch direktes Parsen des Eingabestroms der HTTP-Anfrage verarbeiten müssen.

Glücklicherweise sind Sie nicht der Erste, und es gibt einige gute Open-Source-Bibliotheken, die sich um diese Aufgabe kümmern.

Ich habe mit Apache FileUpload . Sie erstellen einen Parser, übergeben ihm ein Request-Objekt und durchlaufen dann die verschiedenen Elemente. Eines davon wird Ihr verstecktes Feld sein.

1voto

Steven P. Punkte 913

Die mehrteilige Kodierung sollte versteckte Textfelder nicht beeinträchtigen. Es ist wahrscheinlich etwas anderes. Können Sie mehr von dem HTML/Servlet-Code posten?

1voto

Gala101 Punkte 454

Ich bin nicht sicher, ob das hilft, aber ich habe mehrteilige Formulare in JSP-Seiten verwendet, die an ein Struts-Servlet übermittelt werden, und diese Seiten haben versteckte Felder, die in meinen Struts-Action-Klassen empfangen werden (in Struts ActionForm verpackt), also glaube ich nicht, dass es hier einen harten Stopp gibt.

Haben Sie versucht, diesen Wert als String zu empfangen und zu sehen, was tatsächlich dabei herauskommt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X