# file upload / download über http



## little_b (11. Dez 2006)

Hallöchen,

ich benutze als client den HttpClient von jakarta.commens und als server ein servlet welches auf einem tomcat5 läuft.
Ich möchte Dateien in beide Richtungen austauschen. 
Das handshake funktioniert und strings übertragen funktioniert auch in beide Richtungen.

Als erstes interessiere ich mich für den upload.
Dazu verwende ich auf dem client die FilePart Klasse um mehrere Files an den Request
zu übergeben. 

Auf dem Server möchte ich dann die FileUpload Klassen verwenden.

Frage :
Kann ich den upload so realisieren, oder ist mein Ansatz falsch (kombination von filePart und uploadFile) ?


// CLIENT

```
public PostMethod postFileUpload(String key, String value, File[] file)
        throws ApplicationException {

        PostMethod  postMethod = new PostMethod(UtilDef.SERVERURL);
        
        postMethod.getParams().setParameter(
                HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler(UtilDef.METHODRETRY, false));
        
        int statusCode;
        try {
            Part[] parts = new Part[file.length + 1];

            parts[0] = new StringPart(key, value);
            
            for (int i = 1; i <= file.length; i++) {
                parts[i] = new FilePart(file[i].getName(), file[i]);
            }

            postMethod.setRequestEntity(
                    new MultipartRequestEntity(parts, postMethod.getParams()));
            
            statusCode = client.executeMethod(postMethod);

            if (statusCode != HttpStatus.SC_OK) {
                throw new ApplicationException(statusCode);
            }

        } catch (HttpException exc) {
            throw new ApplicationException(ExceptionDef.EXC_HTTP, exc);
            
        } catch (IOException exc) {
            throw new ApplicationException(ExceptionDef.EXC_IO, exc);
        } //  DO NOT postMethod.releaseConnection() before response got data.
        
        return postMethod;
    }
```


// SERVER

```
// ...              
     case MessageDef.UPLOAD_FILES:
                    
                    DiskFileItemFactory factory = new DiskFileItemFactory();
                    ServletFileUpload fu = new ServletFileUpload(factory);
                    List items;
                    try {
                        items = fu.parseRequest(req);
                        Iterator iter = items.iterator();
                        while (iter.hasNext()) {
                            FileItem item = (FileItem) iter.next();
                    //...
                    break;
```

danke,

bastian


----------



## little_b (11. Dez 2006)

Ich verwende eine message um den Server mitzuteilen was ich möchte.
Bisher habe ich mit NameValuePairs gearbeitet und dann auf dem Server
nach der message geparst :


```
// SERVER 
String message = req.getParameter(MessageDef.MSG.trim());
    switch(message) ...
```

Nun möchte ich aber ein File übertragen. Leider ist mein StringParts
auf dem server 'null'. Wenn ich anstelle des StringParts ein NameValuePair
verwende und danach filePart, dann ist die message immer noch null.

Könnte das an dem content type liegen?

Wie setzte ich den content type auf dem httpclient ?

Wie kann ich mit einem servlet einen string part auslesen?

danke,

bastian


----------



## SlaterB (11. Dez 2006)

vielleicht was Richtung
setHeader("content-type", ..);

weiß nicht genau was du da so an APIs einsetzt, 
vielleicht helfen dennoch Lehrbücher wie

http://www.galileocomputing.de/openbook/javainsel5/javainsel16_011.htm


----------



## little_b (11. Dez 2006)

Das mit dem setHeader ist shonmal ein guter Ansatz.
Ich nehme die bibos von jakarta-commons (steht genz oben im ersten thread) 

Leider hat mir der Link nicht so geholfen ...



> 16.10 Apache Jakarta Commons HttpClient und Net  downtop
> 
> Das Java-Netzwerkpaket und insbesondere die Klasse URLConnection beziehungsweise HttpConnection bieten Basisfunktionalität für den Zugriff auf Internet-Ressourcen. *Allerdings fehlen komfortable Methoden, etwa für Cookies oder Multi-Part Form-Data POST, also Möglichkeiten zum Hochladen von Dateien. Die müsste jeder selbst implementieren, was Zeit und Nerven kostet.*


  :bahnhof: 

Trotzdem vielen dank, hoffe ich find doch noch raus wie das geht,

bastian


----------



## Murray (11. Dez 2006)

little_b hat gesagt.:
			
		

> Leider hat mir der Link nicht so geholfen ...
> 
> 
> 
> ...



Was du hier zitierst, ist ja nur die Einleitung zu diesem Kapitel; die Aussage bezieht sich auf die Standard-Klassen und liefert quasi die Begründung dafür, warum es die anderen Libs gibt.

Ist das Beipsiel 16.10.1 nicht in etwa das, was du zum Upload brauchst?


----------



## little_b (11. Dez 2006)

Leider ist das Kapitel dann auch schon zu ende. Die Methoden die dort benutzt werden sind
alle deprecated, ich habs trotzdem mal probiert, ohne Erfolg.
Das Problem was ich im Moment habe ist aber leider Serverseitig.

Ich fasse einmal den Stream an um eine message(einen String) auszulesen 
(clientseitig ein NameValuePair) und danach möchte ich ein file auslesen.
leider weiss ich immer noch nicht wie das geht. Muss ich alle bisherigen
NameValuePairs in StringParts umwandeln ?

Kann ich überhaupt 



> String message = req.getParameter(MessageDef.MSG.trim());



und später



> items = fu.parseRequest(req);



machen, also kann ich überhaupt den request dann nochmal mit einem anderem content type anfassen ?

Wie parse ich einen StringPart ?


Und vielen dank für die Hilfe,      *völlig verzweifelt* 

bastian


----------

