# Dateiupload mit Java und PHP



## fanste (19. Oktober 2006)

Hi,

Ich bräuchte für eine Homepage einen Dateiupload via Java und PHP (also kein Servlet). Ich habe hier schon einige Beispiele gesehen, aber keines, was ich gebrauchen kann. Ein fertiges Javaprogramm will ich nicht nehmen, da ich es dem Design etwas anpassen will und die meisten nicht die Funktionen haben, die ich brauche.


Man soll Dateien auswählen können, die dann "Zwischengespeichert" werden. Erst wenn man den Button Upload drückt, soll eine Datei nach der anderen Hochgeladen werden.
Zusätzlich habe ich mir überlegt, dass sich das Programm erst von einem PHP-Script auf dem Server die maximale Dateiuploadgröße holt und dem entsprechend bei zu großen Dateien handelt, oder mehrere kleinere Dateien in einem Rutsch uploaded.
Eine Progress-Bar, die den aktuellen Fortschritt der Datei und eine, die den Gesammtfortschritt anzeigt, sollten dabei weniger das Problem sein.

Des weiteren soll auf dem Server die Ordnerstruktur beibehalten werden, wenn diese Option ausgewählt wurde. Man muss also jeweils noch den Pfad ab einem bestimmten Verzeichnis mitsenden. (C:\test\upload\datei.txt => \upload\datei.txt). Der Teil des Pfades, der wegbleiben soll, sollte man ebenfalls angeben können.

Und als weiteres Extra wollte ich, dass man die Verzeichnisstrucktur des Servers in dem Programm sehen können soll (extra Fenster), damit man dann auswählen kann, wohin diese Dateien sollen.

Ich habe schon etwas mit dem JFileChooser-Element rumgespielt. Dabei ist mir vor allem aufgefallen, dass z.B. keine Dateityp bezigenen Icons angezeigt werden, wie ich es in ein paar fertigen Programmen gesehen habe. Kann man das ohne Probleme einstellen? Geht auch eine Bildervorschau?


Nun verlange ich nicht, dass mir hier jemand ein fertiges Programm abliefert, ich wünsche mir nur, dass ihr mir ein paar Tipps gebt, wie ich das Ganze lösen kann und vor allem, welche Elemente ich dazu alles brauche.

Zum Schluss muss noch gesagt werden, dass das ganze ein Applet werden soll (wie die meisten sich schon beim Wort Homepage gedacht haben dürften ). Ich weiß, dass es da zum Teil Probleme mit den Zugriffsrechten gibt, ich weiß aber auch, dass es geht, denn sonst könnte man solche Applets ja auch nicht im Internet finden.

Ich hoffe auf eure Hilfe.


----------



## fanste (22. Oktober 2006)

Hat keiner eine Antwort?

Ich bin bisher soweit gekommen, dass der Dateiauswahl-Dialog die Dateiicons anzeigt. Wie kann ich das Fenster noch so "bearbeiten", dass rechts die Leiste mit den Button Arbeitsplatz, Desktop, ... verschwindet und für Bilder eine Vorschau sichtbar ist?


----------



## Billie (23. Oktober 2006)

Zum Filechooser selbst, kannst du dir diesen Link vom Sun-Tutorial mal ansehen:

http://java.sun.com/docs/books/tutorial/uiswing/components/filechooser.html#advancedexample

Für Dateiuploads generell findest du im Forum glaub ich mehr als genug. Thomas verweist in solchen Fällen immer wieder gern auf den HttpClient von Apache/Jakarta:

http://jakarta.apache.org/commons/httpclient/


----------



## Benzol (23. Oktober 2006)

Ich habe ähnliches auch schon machen wollen... und mit etlicher Hilfe aus dem Forum hab ichs dann auch geschafft. Ich gebe dir mal meine Funktion zum übertragen von Dateien an ein PHP-Script. Wie du das entsprechende Gegenstück von PHP scriptest, steht weiter unten. Ich hoffe es hilft dir..  


```
public void SubmitPicture(String exsistingFileName, String ScriptSource)
    {
        //JOptionPane.showMessageDialog(null, "Dateiname:"+exsistingFileName );
        
        HttpURLConnection conn = null;
        BufferedReader br = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;

        InputStream is = null;
        OutputStream os = null;
        boolean ret = false;
        String StrMessage = "";

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "*****";

        int bytesRead, bytesAvailable, bufferSize;

        byte[] buffer;

        int maxBufferSize = 1*1024*1024;
        String responseFromServer = "";
        String urlString = getCodeBase()+"includes/"+ScriptSource;
        //JOptionPane.showMessageDialog(null, "Sende an:"+urlString );

        try
        {
            File file = new File(exsistingFileName);
            //Datei laden
            FileInputStream fileInputStream = new FileInputStream(file);

            //Neue URL zum PHP-Script erstellen
            URL url = new URL(urlString);

            //Verbindung zum PHP-Script aufbauen
            conn = (HttpURLConnection) url.openConnection();

            //Input senden
            conn.setDoInput(true);

            //Output empfangen
            conn.setDoOutput(true);
            conn.setUseCaches(false);

            //Verbindungseinstellungen
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

            dos = new DataOutputStream( conn.getOutputStream() );
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"bild\";"
              + " filename=\"" + exsistingFileName +"\"" + lineEnd);
            dos.writeBytes(lineEnd);

            //Buffer mit maximaler Größe erstellen
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            //Datei aufrufen und in Stream schreiben
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
           
            while (bytesRead > 0)
            {
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }
            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            //Stream schliessen
            fileInputStream.close();
            dos.flush();
            dos.close();

        }
        catch (MalformedURLException ex)
        {
            JOptionPane.showMessageDialog(null, "Fehler beim Verbindungsaufbau mit Script-Dateien.", "Fehler",JOptionPane.WARNING_MESSAGE);
        }
        catch (IOException ioe)
        {
            JOptionPane.showMessageDialog(null, "Fehler beim Laden des Bildes.", "Fehler",JOptionPane.WARNING_MESSAGE);
        }
        //Serverantwort empfangen
        try
        {
            inStream = new DataInputStream ( conn.getInputStream() );
      
            
            String str;
            String output = "";

            while (( str = inStream.readLine()) != null)
            {
                output = output+str;          
            }
            if(output != "")
            {
                //JOptionPane.showMessageDialog(null, output );    
            }
            inStream.close();
        }
        catch (IOException ioex)
        {
            JOptionPane.showMessageDialog(null, "Fehler beim Empfangen der Serverantwort.", "Fehler",JOptionPane.WARNING_MESSAGE);
        }
    }
```


```
//Daten empfangen
$bild = $_FILES['bild']['name'];	 
$tmp_name = $_FILES['bild']['tmp_name'];
```

Leider funktioniert das nur mit Dateien... willst du noch Formdata übertragen, dann wirds nochmal komischer... habe das bis zum Ende nicht hinbekommen. Meine Lösung war, die Datei nach der Benutzerid zu bennen und das vom PHP-Script auslesen zu lassen. Der Rest lief dann über eine DB.


----------



## Thomas Darimont (23. Oktober 2006)

Hallo!

Also für FileUploads von Java -> PHP verwende ich immer: 
MultiPartFormOutputStream http://forum.java.sun.com/thread.jspa?forumID=31&threadID=451245

Funktioniert einwandfrei 

Gruß Tom


----------



## fanste (23. Oktober 2006)

Danke euch dreien. Werde mich mal in den Code einarbeiten und schauen, wie ich damit zurecht komme.

Villeicjt könnt ihr mir derweil ncoh meine letzte Frage beantworten:


			
				fanste hat gesagt.:
			
		

> Ich bin bisher soweit gekommen, dass der Dateiauswahl-Dialog die Dateiicons anzeigt. Wie kann ich das Fenster noch so "bearbeiten", dass rechts die Leiste mit den Button Arbeitsplatz, Desktop, ... verschwindet und für Bilder eine Vorschau sichtbar ist?


----------

