Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm

Meri

Mitglied
Hallo Zusammen,
ich brauche eure Hilfe und zwar hab ich für einen Bekanten in Java ein Verwaltungsprogramm geschrieben, wo nun noch das Hochladen einer Datei fehlt. Ich habe es auch schon fast gelöst, allerdings klappt es bis jetzt nur mit dem Kopieren auf dem lokalen Rechner und ich möchte es aber auf einen Apache Server hochladen. Verbindung zu diesem Server besteht bereits, da ich die Datenbank von dort bereits in meinem Programm anspreche, aber das Hochladen der ausgewählten Datei auf den Server klappt noch nicht.

Ich habe schon verschiedenes gefunden, ob mit einem HttpServlet oder den fileUpload von Apache, aber beide wollen auch immer noch das ich die javax.servlet Libary verwende, aber diese schaffe ich nicht einzubinden.
Habt ihr eine idee wie ich die Verwenden kann, wie z.b. hier beschrieben ist: Upload File to Server Using Servlet Example - The Java Programmer
Oder wie ich es sonst machen kann, denn ich möchte eigentlich über ein Menü oder Button in meinem Javaprogramm die Datei auf meinem PC auswählen und dann dort auf dem Server speichern, damit ich später über eine HTML-Seite diese Datei (pdf oder Bild) anzeigen kann.

Ich wäre euch sehr dankbar, wenn ich mir Tips oder Ideen habt.

Grüße
Meri
 
Wenn ich Dein Anliegen richtig verstehe, bist Du in der ganz falschen Baustelle: Dir geht es darum, einen Upload durchzuführen und nicht darum, serverseitig den Upload zu behandeln.

Wenn Du einen Apache laufen hast, wäre die Frage, wie Dateiuploads aktuell serverseitig gehandhabt werden.
 
Ja genau ich möchte die Datei von dem Javaprogram aus auf den Apache Server hochladen, aber das habe ich festgestllt geht nicht so wirklich. Oder gibt es doch eine Möglichkeit?

Außer aus dem JavaProgramm raus über einen Link in einem Browser eine html seite aufzurufen, welche den Upload über ein Formular auf eine weitere PHP-Seite dann auf dem Apache lädt?
 
Ok und wie spreche ich das aus Java an? Geht das über einen Button in dem Programm?
Und wie wird das dann entgegen genommen, bzw. bekommt das der User mit oder läuft das php-script ganz im Hintergrund ab?
 
Ich kann Dir später ein Beispiel zusammenbauen (mit PHP auf dem Server und Java auf dem Client).

Im Prnzip läuft das so, dass der Request beim Apache aufschlägt, der dann dafür sorgt, dass das PHP-Skript ausgeführt wird. Die Antwort des PHP-Skripts wird wiederum an den Client übertragen (ein Request-Response-Zyklus). Was der Benutzer davon mitbekommt, hängt vom Client ab. In Java kannst Du das gestalten, wie Du willst. Natürlich kannst Du den Upload auch starten wie Du willst, z. B. auf Knopfdruck oder per Drag & Drop.
 
Quick & Dirty:
PHP:
<?php
$uploaddir = '/pfad/zum/uploadverzeichnis';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

set_error_handler(function() { http_response_code(400); });
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    http_response_code(201);
}
?>
Hier musst Du $uploaddir anpassen.

Java-Client:
Java:
import java.nio.file.Files;
import java.nio.charset.StandardCharsets;
import java.io.*;
import java.net.*;
import java.util.StringJoiner;

public class Upload {
    private static final String CRLF = "\r\n";
    
    protected Upload() {}

    public static int formUpload(File file, String formField, String url) throws IOException {
        String boundary = Long.toHexString(System.currentTimeMillis());

        URLConnection conn = new URL(url).openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        try (OutputStream os = conn.getOutputStream()) {
            StringJoiner j = new StringJoiner(CRLF);
            j = new StringJoiner(CRLF);
            j.add("--" + boundary);
            j.add("Content-Disposition: form-data; name=\"" + formField + "\"; filename=\"" + 
                    file.getName() + "\"");
            j.add("Content-Type: application/octet-stream");
            j.add("Content-Transfer-Encoding: binary");
            j.add(CRLF);

            writeFlush(os, j.toString());
            Files.copy(file.toPath(), os);
            writeFlush(os, CRLF);
            writeFlush(os, "--" + boundary + "--" + CRLF);
        }

        return ((HttpURLConnection) conn).getResponseCode();
    }

    private static void writeFlush(OutputStream os, String value) throws IOException {
        os.write(value.getBytes(StandardCharsets.UTF_8));
        os.flush();
    }

    public static void main(String[] args) {
        if (args.length != 3) {
            System.out.println("Parameter: FILE FIELD URL");
            System.out.println("Sendet FILE als FIELD eines Formulars an URL");
            System.exit(1);
        }

        try {
            int response = formUpload(new File(args[0]), args[1], args[2]);
            System.out.printf("Ergebnis: %d\n", response);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
Die Klasse kannst Du so verwenden. Die main-Methode ist nur zu Demozwecken, im Endeffekt musst Du lediglich wie in Zeile 50 die Methode formUpload aufrufen. Die Parameter sollten klar sein, der zweite muss "userfile" lauten (s. PHP-Skript).
 

Zurück
Oben