1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Problem mit URLConnection und HTTP-Multiformupload

  • Schlingel
  • 17. Oktober 2012 um 16:16
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Schlingel
    Punkte
    51
    Beiträge
    8
    • 17. Oktober 2012 um 16:16
    • #1

    Ich sitze im Moment an Code der einen Upload abbilden soll. Da das ganze bei mir im Großen nicht läuft, habe ich mir mal eine kleine Testumgebung aufgestellt mir der ich das machen kann.

    Das PHP-Skript auf der Server-Seite sieht so aus:

    PHP
    <?php
        $uploaddir = './uploads/';
        $uploadfile = $uploaddir . basename($_FILES['file1']['name']);
    
        if(move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile)) {
          echo 'success ' . $_POST['input1'] . ' ' . $_POST['input2'];
        } else {
          echo 'error ';
          var_dump($_FILES);
          echo ' ';
          var_dump($_POST);
        }
    
    
    
    
    ?>
    Alles anzeigen

    Das funktioniert auch. Per HTML-Seite getestet.

    Doch der Java-Code will und will nicht laufen. Ich hab mir im Wireshark angeschaut wie der Request vom Browser aussieht und wie der vom Java-Code. Die Unterschiede sind marginal. Ich denke, dass es daran also nicht liegt. (Kann ich gerne noch posten, falls Bedarf besteht.)

    Beim Server kommen jedenfalls weder die FILE noch die POST Parameter an. Dementsprechend returniert dieser nur:
    error array(0) {} array(0) {}

    Das einzige was anders ist: Beim Request vom Java-Code stimmt die IP-Adresse nicht. In diesem SO-Post wird aber gemeint, dass sei egal.

    Code
    public class SimpleUpload {
        private static final String FILE_PATH = "/Users/MyUser/Documents/workspace/SimpleUploadTest/assets/clicknpoint.png";
    
        private static final String DEST_URL = "http://localhost/test/upload.php";
    
        @Test
        public void uploadFile_shouldSucceed() throws IOException {
            URL url = new URL(DEST_URL);
            String boundary = "-----------------------------" + Long.toString(System.currentTimeMillis());
            PrintWriter writer = null;
            URLConnection con = url.openConnection();
    
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setRequestProperty("Accept-Charset", "utf-8");
            con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8");
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            OutputStream output = con.getOutputStream();
            InputStream input = new FileInputStream(new File(FILE_PATH));
            writer = new PrintWriter(new OutputStreamWriter(output));
    
            writer.println(boundary);
            writer.println("Content-Disposition: form-data; name=\"input1\"");
            writer.println();
            writer.println("1234");
    
            writer.flush();
    
            writer.println(boundary);
            writer.println("Content-Disposition: form-data; name=\"input1\"");
            writer.println();
            writer.println("asdf");
    
    
    
    
            writer.flush();
    
            writer.println(boundary);
            writer.println("Content-Disposition: form-data; name=\"file1\"; filename=\"clicknpoint.png\"");
            writer.println("Content-Type: image/png");
            writer.println();
    
            writer.flush();
    
            int length = 0;
            byte[] buffer = new byte[1024];
    
            for(length = 0; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
            writer.flush();
            input.close();
    
            writer.println();
            writer.println(boundary + "--");
    
            writer.flush();
    
            input = con.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    
            String cur = null;
            StringBuffer buf = new StringBuffer();
    
            while((cur = reader.readLine()) != null) {
                buf.append(cur);
            }
    
            System.out.println(buf.toString());
    
            Assert.assertTrue(buf.toString().startsWith("success"));
        }
    }
    Alles anzeigen

    Einmal editiert, zuletzt von Schlingel (17. Oktober 2012 um 16:19)

  • Paulchen
    Gast
    • 17. Oktober 2012 um 16:33
    • #2

    Geht es dir darum, herauszufinden, warum das nicht funktioniert, oder willst du einfach nur einen Dateiupload durchführen?

    Ich weiß zwar, dass das vielleicht nicht das ist, was du hören willst, aber für Java gibt's eine nette Library für HTTP-Requests.

    Einmal editiert, zuletzt von Paulchen (17. Oktober 2012 um 16:34) aus folgendem Grund: falscher Link

  • Schlingel
    Punkte
    51
    Beiträge
    8
    • 17. Oktober 2012 um 16:40
    • #3

    Ersteres.

    Die Bibliothek für die ich das schreibe wird auf Android eingesetzt und dort ist die URLConnection sehr viel schneller als der HTTPClient von Apache. Abgesehen davon, empfiehlt auch Google selbst die URLConnection zu verwenden.

    By the way, dein Link zeigt auf eine alte Version. Hier geht's zur aktuellen Seite.

  • sutupud
    Punkte
    1.659
    Beiträge
    320
    • 17. Oktober 2012 um 21:54
    • #4

    sieh dir mal die beispiele in rfc1867 an:

    - die boundary wird jeweils durch -- eingeleitet
    - im content-type selbst werden diese nicht angeführt

    so funktioniert es:

    PHP
    String bound = Long.toString(System.currentTimeMillis());
            String boundary = "--" + bound;
            // ...
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + bound);

    was rauskommt sieht dann so aus:

    Code
    POST / HTTP/1.1
    Accept-Charset: utf-8
    Accept: text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8
    Content-Type: multipart/form-data; boundary=1350503516300
    User-Agent: Java/1.7.0_07
    Host: localhost:2020
    Connection: keep-alive
    Content-Length: 4270
    
    
    --1350503516300
    Content-Disposition: form-data; name="input1"
    
    
    1234
    --1350503516300
    Content-Disposition: form-data; name="input1"
    
    
    asdf
    --1350503516300
    Content-Disposition: form-data; name="file1"; filename="clicknpoint.png"
    Content-Type: image/png
    
    
    [COLOR='#D3D3D3'][...][/COLOR]
    --1350503516300--
    Alles anzeigen

    wenn du mehr - möchtest, dann werden die einfach zum teil von 'bound':

    PHP
    String bound = "---------------------------" + Long.toString(System.currentTimeMillis());
            String boundary = "--" + bound;
            // ...
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + bound);
  • Schlingel
    Punkte
    51
    Beiträge
    8
    • 18. Oktober 2012 um 13:32
    • #5

    Das war's!

    Super! Weder auf java-forum.org noch auf Stackoverflow wusste jemand weiter. Ab jetzt komme ich mit den knackigen Problemen gleich hier her!

    Echt toll!

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Tags

  • http
  • java
  • urlconnection
  1. Datenschutzerklärung
  2. Impressum