OutputStream via POST senden

Sekundentakt

Bekanntes Mitglied
Hallo,

mein Ziel ist, eine CSV-Datei zu downloaden, zu überprüfen, ob sie valide ist und sie dann an eine URL zu schicken.

Wenn die CSV-Datei sehr groß ist, müsste ich sie erst auf Platte schreiben, bevor ich sie an eine weitere URL schicke (die Datei würde via POST-Methode übertragen werden). Andernfalls gäbe es eine Heap-Exception.

Jetzt ziehe ich aber folgende Überlegungen in Betracht: kann ich auch einen OutputStream via Post schicken? Das würde bedeuten, die Ziel-URL erhält nicht alles auf einmal.

Alternativ habe ich überlegt, den Input-Stream der Datei in kleinere Stücke zu zerhacken.
Ich warte, bis der Input-Stream eine Größe X erreicht hat, verwandle den Inhalt via StringBuilder in einen String und sende kleinere CSV-Dateien an die Ziel-URL.
Dadurch erspare ich mir die Arbeit auf der Festplatte.

Bevor ich das Kleinhacken aber beginne, will ich erst mal wissen, ob man nicht auch streamen kann und wenn ja, wie dort die Beispiele aussehen.

Alternative Ansätze zum skalierbaren versenden von Daten sind gerne gesehen!

Danke!

Beste Grüße
 
Alternativen zu was denn? du verrätst in keinem Wort, um was genau es geht,
'etwas an eine URL senden' ist kein Fachbegriff in Java

verwendest du
URLConnection (Java Platform SE 6)
und ähnliche? wie setzt du dort bisher den String?

dort gibt es getOutputStream(), darin kann man streamisiert Daten übergeben, entweder direkt Bytes für Bytes aus einem Netzwerk-InputStream gelesen oder von einer Datei oder von den kompletten Daten im Hauptspeicher
 
Okay, ein paar mehr Details:

Ich nutze den Apache Commons Http Client.

In beiden nachfolgend beschriebenen Fällen, hole ich mir via PostMethod über die Entity des Responses die Datei, die ich herunterladen will.

Möglichkeit a) Ich schreibe die heruntergeladene Datei auf Platte. Dann lade ich nicht die Datei hoch, sondern eine URL zur Datei. Das heißt ich schicke via PostMethod den Parameter fileUrl + url mit.

Möglichkeit b) via getResponseBodyAsStream() lese ich x Zeilen des Responses (der CSV) ein, bündle diese via StringBuilder zu einem String und sende diesen via PostMethod an eine URL zum weiterverarbeiten (ja, die dahinterstehende Applikation nimmt die CSV-Datei entweder als POST-Value oder als URL entgegen. Im zweiten Falle würde sie die Datei selbst laden).

Bei Möglichkeit b) brauche ich die Festplatte nicht belasten, daher favorisiere ich diese bisher.

Noch besser wäre allerdings noch die Umsetzung als Stream.

Also das die PostMethod zur Ziel-Url keinen zusammengeschnittenen CSV-String verschickt, sondern die gesamte Datei streamt. EDIT: Fast hätte ich es vergessen. Bei dieser dritten Möglichkeit fehlt mir der Ansatz. Ich weiß nicht, wie ich das umsetzen soll.

Ich hoffe, dass war jetzt etwas verständlicher?
 
zu HTTPClient kann ich persönlich noch weniger sagen, aber Stream wird es dort doch auch geben,
eine direkte google-Suche führte zu
HttpClient - HttpClient Performance Optimization Guide

siehe da das Beispiel mit
Java:
File myfile = new File("myfile.txt");
PostMethod httppost = new PostMethod("/stuff");
httppost.setRequestEntity(new FileRequestEntity(myfile));
dort wird ein Stream verwendet, statt File gehen auch andere Streams
 

Zurück
Oben