1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Problem mit URLConnection und HTTP-Multiformupload

  • Schlingel
  • 17. Oktober 2012 um 16:16
  • Unerledigt
  • Schlingel
    3
    Schlingel
    Mitglied
    Reaktionen
    1
    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

    Es gibt nichts gutes, außer man tut es!
    - Erich Kästner

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

  • Paulchen
    1
    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
    3
    Schlingel
    Mitglied
    Reaktionen
    1
    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.

    Es gibt nichts gutes, außer man tut es!
    - Erich Kästner

  • sutupud
    13
    sutupud
    Mitglied
    Reaktionen
    59
    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);

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    &#128513;&#128514;&#128515;&#128516;&#128517;&#128518;&#128519;&#128520;&#128521;&#128522;&#128523;&#128524;&#128525;&#128526;&#128527;&#128528;&#128530;&#128531;&#128532;&#128534;&#128536;&#128538;&#128540;&#128542;&#128544;&#128545;&#128546;&#128547;&#128549;&#128552;&#128553;&#128554;&#128555;&#128557;&#128560;&#128561;&#128562;&#128563;&#128565;&#128566;&#128567;

  • Schlingel
    3
    Schlingel
    Mitglied
    Reaktionen
    1
    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!

    Es gibt nichts gutes, außer man tut es!
    - Erich Kästner

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Tags

  • http
  • java
  • urlconnection

Rechtliches

Impressum

Datenschutzerklärung