# Dateiupload mit Applet



## zuckerbrini (12. Januar 2009)

Hi!
Bin jetzt schon seit einigen Tagen dabei einen Dateiupload mit einem Applet zu realisieren. Gehen muss das ganze ja irgendwie, weil ich sowas ja schon auch mal im Internet gesehen hab.
Der Benutz wählt eine beliebige Datei (Bilder, Texte,....) aus und die Datei wird dann auf den Server geladen wo auch das Applet liegt.

Hier mal mein Ansatz:

```
private void upload(String pfad, String filename){
try {
            InputStream is =  new FileInputStream(pfad);
            byte[] buffer = new byte[500000];
            int count = -1;
            URL url = new URL(getCodeBase+ filename);
            System.out.println("URL: "+url);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            
            while((count = is.read(buffer)) > 0){
                System.out.println("Buffer: "+buffer.toString());
                os.write(buffer,0,count);
            }
            //os.flush();
            os.close();
            is.close();
        } catch (Exception e) {
            System.err.println("Fehler beim upload von: " + pfad + " " + e);
        }
}
```

Hoffe ihr könnte mir weiterhelfen....


----------



## Billie (12. Januar 2009)

Hier im Forum findest du etliche Beiträge zum Upload von Dateien. Suche nach entsprechenden Themen (zB Upload, Dateiupload, usw.).

Ansonsten empfehle ich dir auch, den Apache HTTP Client genauer unter die Lupe zu nehmen.

Es stellt sich auch die Frage, was deine Dateien wie am Server entgegennimmt - ein PHP Script?


----------



## joschi70 (13. Januar 2009)

Hi zuckerbrini,

habe hier schon mal eine Klasse zum File Upload gepostet.

http://www.tutorials.de/forum/java/329834-einfaches-java-applet-fuer-dateienupload.html

Gruß
joschi


----------



## zuckerbrini (16. Januar 2009)

Danke schon mal für eure Tipps. Hab alles versucht und wieder im Internet und sonst wo nach Lösungen gesucht, aber ich komme trotzdem noch immer nicht ans Ziel.

Um den Dateiupload mit einem Applet zu realisieren nutze ich nun commons fileUpload (Apache HTTPClient)commons fileUpload (Apache HTTPClient)

Mein Problem ist nun, dass ich nicht genau weiß wie ich das ganze im Applet aufrufe bzw. wie ich dem Servlet übergebe welches File er uploaden soll. 

Mein Applet-Code: 

```
private void upload(String pfad, String filename) { 
        try { 
            File file = new File(pfad); 
            URL url = new URL ("http://xxxxx/Servlet"); 
            URLConnection con = url.openConnection(); 
            con.setDoOutput(true); 
            con.setRequestProperty("Content-Type", "multipart/form-data"); 
            System.out.println("vor ObjectOutputstream"); 
            ObjectOutputStream oos = new ObjectOutputStream(con.getOutputStream()); 
            oos.writeObject(file); 
            oos.flush(); 
            oos.close(); 
        } catch (Exception e) { 
            System.err.println("Fehler beim upload von: " + pfad + " " + e); 
        } 
    }
```


Für das Servlet nutze ich erstmals den Code von JavaAtWork 

```
package uploadserver; 

import java.io.File; 
import java.io.IOException; 
import java.net.URLDecoder; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileItemFactory; 
import org.apache.commons.fileupload.FileUpload; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

/** 
 * Class for storing the uploaded files. 
 * 
 * @author JavaAtWork 
 */ 
public class UploadServlet extends HttpServlet { 

  /** 
    * The base upload directory. In this directory all uploaded files will 
    * be stored. With the applet param tag 'directory' you can create a 
    * subdirectory for a user. 
    * See http://www.javaatwork.com/parameters.html#directory for more 
    * information about the 'directory' param tag. For a Windows environment 
    * the BASE_DIRECTORY can be e.g. * 'c:/temp' for Linux environment '/tmp'. 
    */ 
  private static final String BASE_DIRECTORY = "/tmp"; 

  protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 

    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    // check if the http request is a multipart request 
    // with other words check that the http request can have uploaded files 
    if (isMultipart) { 

      //  Create a factory for disk-based file items 
      FileItemFactory factory = new DiskFileItemFactory(); 

      //  Create a new file upload handler 
      ServletFileUpload servletFileUpload = new ServletFileUpload(factory); 

      // Set upload parameters 
      // See Apache Commons FileUpload for more information 
      // http://jakarta.apache.org/commons/fileupload/using.html 
      servletFileUpload.setSizeMax(-1); 

      try { 

        String directory = ""; 

        // Parse the request 
        List items = servletFileUpload.parseRequest(request); 

        // Process the uploaded items 
        Iterator iter = items.iterator(); 

        while (iter.hasNext()) { 
          FileItem item = (FileItem) iter.next(); 

          // the param tag directory is sent as a request parameter to 
          // the server 
          // check if the upload directory is available 
          if (item.isFormField()) { 

            String name = item.getFieldName(); 

            if (name.equalsIgnoreCase("directory")) { 

              directory = item.getString(); 
            } 

            // retrieve the files 
          } else { 

            // the fileNames are urlencoded 
            String fileName = URLDecoder.decode(item.getName()); 

            File file = new File(directory, fileName); 
            file = new File(BASE_DIRECTORY, file.getPath()); 

            // retrieve the parent file for creating the directories 
            File parentFile = file.getParentFile(); 

            if (parentFile != null) { 
              parentFile.mkdirs(); 
            } 

            // writes the file to the filesystem 
            item.write(file); 
          } 
        } 

      } catch (Exception e) { 
        e.printStackTrace(); 
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
      } 

      response.setStatus(HttpServletResponse.SC_OK); 

    } else { 
      response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    } 
  } 
}
```


Kann mir jemand weiterhelfen, was ich da falsche mache bzw. was ich falsch verstanden habe?


----------



## joschi70 (16. Januar 2009)

Hi,

hier gibt's ein Beispiel:
http://www.java-tips.org/other-api-...-use-multipart-post-method-for-uploading.html

Vielleicht hilft Dir das weiter...

Gruß
joschi


----------



## zuckerbrini (20. Januar 2009)

Hi!

Also mein Problem besteht leider noch immer. Hab jetzt die ganzen Links durchgeackert und wieder herumprobiert, aber.... es will einfach nicht.


Es läuft alles Fehlerfrei durch. Nur wird eben die Datei am Server nicht angelegt.
Außerdem habe ich den Verdacht, dass mein Servlet gar nicht aufgerufen wird, da ein System.out.println im Servlet nicht angezeigt wird (natürlich erwarte ich mir diese Ausagbe nicht in der JavaKonsole sondern in einer Datei am Server, also in meinem Fall (Tomcat) in der Datei catalina.out).

Habt ihr vielleicht Tips was ich noch versuchen kann?


----------



## matdacat (20. Januar 2009)

Ist etwas schwierig, Dir zu helfen, wenn Du Dir nicht mal sicher bist, ob Dein Servlet aufgerufen wird. Somit kann Dein Webserver falsch konfiguriert sein, Dein Applet nicht signiert oder generell der Code fehlerhaft sein.
Kannst Du denn Dein Servlet über den Browser erreichen?


----------



## zuckerbrini (20. Januar 2009)

Wenn die URL zu meinem Servlet direkt im Browser eingebe, erreiche ich das Servlet. 

Ich bekomme dann aber dir Meldung: HTTP Status 405 - HTTP method GET is not supported by this URL
description The specified HTTP method is not allowed for the requested resource (HTTP method GET is not supported by this URL).

Das müsste doch eigentlich stimmen, weil ich ja in meinem Servlet mit POST arbeit und deshalb keine GET-Methode habe. 
Der Browser möchte aber ein GET machen, da er sich ja irgendwas von der gegenüberliegenden Seite erwartet. 

Also meines Erachtens ist das Servlet erreichbar.
Korrigiert mich bitte wenn ich da was falsch verstanden hab?
Und was könnte ich noch versuchen? Mir sind die Ideen schon ausgegangen...


----------



## zuckerbrini (21. Januar 2009)

Hab das ganze jetzt auch mit GET probiert aber es funktioniert auch nicht. 
Ganz egal ob mit GET oder mit POST ich bekomme immer die IOException 400, was "bad request" beudete.
Hat irgendjemand einen Tipp wie ich diesen Fehler beseitigen kann?


----------

