# File Einlesen mit jsp/servlets



## Rokko_11 (6. Jan 2010)

Hi!

Seit ein paar wochen habe ich folgendes Problem:
Ich hab auf einer jsp-Seite folgendes Formular:


```
<form id="file" name="file" method="post" action="/JavaWebApplication/fileUpload" enctype="multipart/form-data">
       <input type="file" name="casetrain" id="case" accept="text/xml" />
       <input type="submit" name="erstellen2" value="Erstellen" />
</form>
```

Laut meiner bisherigen Webrecherche sollte das stimmen... Glaub ich...

Problem: wenn ich das jetzt in meinem fileUpload-Servlet versuche aufzurufen, bekomme ich leider als
request.getParamter("case") null heraus 

Hab es inzwischen auch mit der Oreilly-Bibliothek versucht, aber ich komme nicht drauf, wie ich in meinem Servlet aus dem Multipart ein ganz normales File erstelle.

Hatte jemand von euch schon das Problem?


----------



## HLX (7. Jan 2010)

Frage nach dem Namen, nicht nach der id:

```
request.getParameter("casetrain");
```


----------



## Rokko_11 (7. Jan 2010)

Ne... klappt nicht.
Hatte anfangs id auch in "casetrain", hab dann aber zum Eintragen ins Forum nur die id geändert 

Mein Problem ist eher dieses "enctype/multi-part". Hab im Internet nur Code zum direkten Hochladen der Datei gefunden, allerdings nicht, wie man diese Datei im Servlet abfragt...


----------



## HLX (7. Jan 2010)

Stimmt, da war was. Du brauchst die Bibliothek commons-fileUpload von Apache:
FileUpload - Home

Damit kommst du dann an die Datei:

```
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List<FileItem> items = upload.parseRequest(request);
```


----------



## Rokko_11.2 (8. Jan 2010)

Hm... Hab jetzt nen Tag lang gegoogelt, aber nix gefunden... auch die Api gibt nix her...

Wie mach ich denn dann aus dem File-Item ein java.io.File?


----------



## HLX (9. Jan 2010)

Wofür brauchst du die Datei als java.io.File?

Du kannst die hochgeladene Datei einfach auf dem Server speichern:

```
List<FileItem> items = upload.parseRequest(request);
java.io.File file = new java.io.File("DateinameUndPfadAufDemServer");
items.get(0).write(file);
```


----------



## Rokko_11 (9. Jan 2010)

Ich muss das File in eine (bereits vorgefertigte) Methode eingeben:
Die Datei (normalerweise ein XML) wird durchgegangen und gemäß eines bestimmten Xml-Schemas wird ein Objekt erstellt mit genau diesen Eigenschaften. Und dort ist der Eingabeparameter ein java.io.File.

Und das ganze soll am Ende so ausehen:
Der User sieht einen File-Input auf der Webseite. Wählt dort die xml-Datei, die er hochgeladen haben will aus und erstellt damit nichtwissend ein neues Java-Objekt, welches dann verrückte Sachen macht 

Und ich bin auf dieses Problem gestoßen, nachdem beim Firefox der Pfad bei einem File-Input nicht mit übergeben wird. Mit dem InternetExplorer habe ich allgemein gar keine Probleme.


----------



## HLX (9. Jan 2010)

Wenn der Übergabeparameter der  bereits vorgefertigten Methode ein java.io.File-Objekt ist, wird in der entsprechenden Methode vermutlich über einen InputStream von der Festplatte des Servers gelesen. Das File-Objekt selbst hält nämlich nicht den Inhalt der Datei, sondern liefert nur Meta-Daten.

Dann müsstest du nur wie oben beschrieben die Datei auf dem Server speichern und anschließend das java.io.File-Objekt an die vorgefertigte Methode übergeben.


----------



## Rokko_11 (9. Jan 2010)

Dankeschön! Das klappt jetzt soweit...

Nur: In meinem echten Quelltext gehört zu dem Button "erstellen2" noch ein textfeld und dann gibts noch einen button mit select-Feld (User hat Entscheidung zwischen 2 Buttons).
Jetzt muss ich ja feststellen, welcher Button geklickt wurde und danach, welche Option von Select-Feld ausgewählt wurde oder welcher Text ins Textfeld eingegeben wurde.
Bei google findet sich irgendwie nur php-relevantes Zeugs... Oder Sachen, die oreillys MultipartRequest-Bibliothek betreffen. Und mit beiden Parsern gleichzeitig klappts dann auch net


----------



## HLX (9. Jan 2010)

Du kannst Fallunterscheidungen über ein hidden field und JavaScript machen. Deine Buttons erhalten dann ein Attribut "onclick" in dem eine JS-Methode aufgerufen wird:

```
...
function setHiddenValue(wert) {
  document.forms[0].hiddenField.value = wert;
}
...
<input type="hidden" name="hiddenField">
<input type="submit" name="erstellen2" value="Erstellen" onclick="setHiddenValue('erstellen2Clicked')"/>
```

Den Wert des hidden field kannst du im Servlet per reqest.getParameter("hiddenField") auswerten.


----------



## Rokko_11 (9. Jan 2010)

Nein... auch diese request.getParameter-Abfrage liefert null  gehört ja auch zum multipart-formular.

Ich glaub, ich mach einfach 2 Formulare, welche auf 2 verschiedene Servlets verweisen...
Allerdings hab ich ja das Problem damit nur verschoben, weil ich ja den Inhalt des Select-Menus oder den Inhalt des Textfeldes nicht bekommen kann...
Ein Session-Attribut kann ich ja nicht irgendwie mit JavaScript setzen, oder?


----------



## HLX (10. Jan 2010)

Nein, das geht nicht.

Falls du zwei Formulare nimmst, müsstest du Werte aus dem ersten Formular per JavaScript in das zweite Formular übernehmen können:

```
function setHiddenValue(wert) {
  document.forms[1].hiddenField.value =  document.forms[0].feldname.value;
}
```


----------

