Problem beim Speichern von ZIP Files über HTTP

Dann würde ich es an deiner Stelle so machen, dass du ein byte[] übergeben bekommst und um dieses zu untersuchen in einen String umwandelst. Dann wirst du meiner Ansicht nach keine Probleme bekommen. Aber das du auf Byte-Ebene arbeitest ist hier nunmal von Nöten.
 
ich arbeite mit dem HTTP Client, dort gibt es die Methoden getResponseBody etc. nicht!
Java:
response.getEntity().writeTo(new FileOutputStream(...));
Muss ich den mit Fehlern rechnen wenn ich den Inhalt als String "zwischenspeicher"?
Wenn du ein falsches Encoding wählst und sich einige Zeichen nicht übersetzen lassen oder nicht eindeutig übersetzen lassen, ja.
Mein Problem ist das ich im Reponse Handler die Daten verarbeite, und manchmal auch untersuche. Denn die Daten sind ja auch HTML Text
response.getEntity().getContentType()
response.getEntity().getContentEncoding()

Damit kannst du feststellen, ob es sich überhaupt um Text handelt. Und welches Encoding da verwendet wird um dann die Daten in einen (UTF-16) String zu konvertieren.

Gruß
 
Ok, so langsam wirds mir klarer!

Ich fasse es mal zusammen:

Ich soll den FileOutputStream() verwenden wo ich kein Charset angebe um meine Daten zu schreiben. Die Daten übergebe ich als byte-Array. Das sollte sowohl bei Binär als auch Stringdaten klappen. Wenn ich die Daten in meinem Response Handler untersuchen will wandle ich sie in einen String um, mit dem Zeichensatz der mir die Seite im Header mitteilt. Ist das korrekt so?

Sollte im Header/Entity kein Zeichensatz vorhanden sein verwende ich UTF-8 oder einen anderen als Standard?
 
Ich soll den FileOutputStream() verwenden wo ich kein Charset angebe um meine Daten zu schreiben.
Ja.
Die Daten übergebe ich als byte-Array.
Noch besser wäre ein Stream (falls du die Daten nicht untersuchen mußt), da dann nicht erst die ganze Datei runtergeladen werden muss. Oder du nutzt gleich die bequeme writeTo Methode.
Wenn ich die Daten in meinem Response Handler untersuchen will wandle ich sie in einen String um, mit dem Zeichensatz der mir die Seite im Header mitteilt. Ist das korrekt so?
Ja.
Sollte im Header/Entity kein Zeichensatz vorhanden sein verwende ich UTF-8 oder einen anderen als Standard?
Du könntest versuchen festzustellen um welches Encoding es sich handelt: http://jchardet.sourceforge.net/

Und ansonsten, halt raten...

Gruß
 
So, danke erstmal für die schnelle und gute Hilfe!

Java:
    // verarebitet den Http Response und setzt den Inhalt
    @Override
    public void processResponse(HttpResponse httpResponse) throws IOException {
        setHttpResponse(httpResponse);
        
        HttpEntity entity = httpResponse.getEntity();
        String charset = EntityUtils.getContentCharSet(entity);

        if(charset == null) {
            charset = HTTP.DEFAULT_CONTENT_CHARSET;
        }

        setContent(EntityUtils.toByteArray(entity));
        setContentAsString(new String(content, charset));
        EntityUtils.consume(entity);
    }

    // Speichert die Datei
    public void saveContent(String fileName, byte[] content) throws HttpCommunicationException {
        OutputStream out = null;

        try {
            File file = new File(getConfiguration().getDirectory(), fileName);
            out = new FileOutputStream(file);
            out.write(content);

            System.out.println(content.length + " Bytes geschrieben in " + file.getAbsolutePath());
        } catch (FileNotFoundException ex) {
            throw new HttpCommunicationException(ex);
        } catch (IOException ex) {
            throw new HttpCommunicationException(ex);
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException ex) {
                throw new HttpCommunicationException(ex);
            }
        }
    }

Ist dies nun die korrekte Lösung? :)
 
Zurück