Fileupload als POST mit HttpURLConnection

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fileupload als POST mit HttpURLConnection

    Hallo allerseits,

    ich möchte von meiner App ein paar POST-Daten an einen Server schicken.
    Die Daten bestehen aus ein paar Parametern und einem ByteArray, das einen beliebigen Inhalt haben kann.
    Der Inhalt des ByteArrays ist beispielsweise eine Bitmap.
    Diese soll auf dem Server unter dem angegebenen Namen new_fn gespeichert werden.

    Ich bekomme das allerdings nicht hin.

    Was funktioniert:
    Aufbau einer Verbindung und Übertragung der POST-Parameter an den Server; diese werden korrekt empfangen, der Server quittiert den Empfang auch mit einem ResponseCode 200.

    Was nicht funktioniert:
    Der Server schreibt kein File; ich nehme an, es werden auch keine Daten empfangen; jedenfalls gibt im PHP-Code eine Abfrage beispielsweise von $_FILES['file']['type'] keine Ausgabe - es sollte mime=image/png sein.

    Der PHP-Code zum Speichern des Files lautet

    Quellcode

    1. move_uploaded_file($_FILES['filename']['tmp_name'], 'uploadFolder/' . $_POST['fn'])
    Der zugehörige Java-Code wirft keine Fehler; SERVERURL stimmt, "magic" und "fn"(= String new_fn, der Filename) kommen beim Server an, mime ist korrekt, und ByteArrayOutputStream outStream sind ca. 100 kB (im Test eine Bitmap im PNG-Format).
    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    URL url = new URL(SERVERURL);
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true); // Allow Inputs
    conn.setDoOutput(true); // Allow Outputs
    conn.setUseCaches(false); // Don't use a Cached Copy
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("ENCTYPE", "multipart/form-data");
    conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=*****");
    dos = new DataOutputStream(conn.getOutputStream());
    dos.writeBytes("--*****\r\n");
    dos.writeBytes("Content-Disposition: form-data; name=\"magic\"\r\n\r\n");
    dos.writeBytes("aref\r\n");
    dos.writeBytes("--*****\r\n");
    dos.writeBytes("Content-Disposition: form-data; name=\"fn\"\r\n\r\n");
    dos.writeBytes(new_fn +"\r\n");
    dos.writeBytes("--*****\r\n");
    // funktioniert bis hier. Jetzt der Fileupload
    dos.writeBytes("Content-Disposition: file; filename=\"" + new_fn + "\r\n");
    dos.writeBytes("Content-Type: " + mime + "\r\n");
    dos.writeBytes("Content-Transfer-Encoding: binary\r\n\r\n");
    dos.writeBytes(new String(outStream.toByteArray(), StandardCharsets.UTF_8));
    dos.writeBytes("\r\n--*****--\r\n");
    dos.flush();
    dos.close();
    if (conn.getResponseCode()!=200) Toast...
    if (conn != null) conn.disconnect();

    Falls jemanden interessiert, woher ich die Angaben zur Übertragung habe: w3.org/TR/html401/interact/forms.html#h-17.13.4.2 (ganz unten).

    Ich vermute, dass die Übergabe aus dem outStream nicht funktioniert, weiß aber nicht, wie die Zeile stattdessen lauten muss.
    Jemand eine Idee?