-
Hallo,
ich lade per Java Dateien runter. Bei normalen .csv Dateien ist das kein Problem, dort habe ich bis jetzt immer den FileWriter benutzt. Nur ist mir jetzt aufgefallen das die .zip Dateien Probleme machen. Die Datei wird zwar erstellt, beim öffnen kommt jedoch dieser Fehler:
Ich nehm mal an das liegt daran das Zip-Dateien nun mal keine Zeichenketten sind, wie zum Beispiel CSV-Dateien.C:\data\RoughData.zip: Unerwartetes Archivende.
Ich habe folgenden HTTP Header:
Jetzt weiß ich das der Inhalt des HTTP Response die Zip-Datei ist, wie behandel ich das nun? Kann ich das ganze in ein String umwandeln und erst beim schreiben in die Datei darauf achten ein besonderen Writer zu nehmen? Wie schreibe ich Zip-Dateien?HTTP/1.1 200 OK
Server: Sun-Java-System-Web-Server/7.0
Date: Wed, 12 Oct 2011 11:59:55 GMT
Content-type: application/octet-stream
Content-Disposition: attachment; filename=RoughData.zip
Cache-Control: max-age=0
Transfer-encoding: chunked
Connection: Keep-AliveWenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
-
12.10.11 14:31 #2
Hi,
also den Typ der Datei erkennst du (normalerweiße) an der Endung. Demnach musst du bei deinem HTTP Header den 'filenamen=...' rausfiltern und die FileExtension ermitteln.
Ist die Datei eine Zip-Datei, schreibst du diese über den ZipOutputStream.
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
12.10.11 14:41 #3
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Das Ganze hat überhaupt nichts mit dem Dateityp zu tun. Mal abgesehen davon, das man den Typ einer Datei besser am MIME Type erkennt, als an der Endung.
Der FileWriter ist dafür ungeeignet, verwende einfach einen FileOutputStream.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
12.10.11 23:04 #4SE Tutorials.de Gastzugang
FileWriter ist wie alle Writer und Reader Klassen NUR für Strings/darstellbare Zeichen geeignet. Ein ZIP ist jedoch eine Binärdatei ... hier brauchst du eine von InputStream/OutputStream abgeleitete Klasse ... auch für das lesen vom Server ... wenn du hier schon mit einem Reader arbeitest , also darauf vertraust das nur darstellbare Zeichen kommen ist das schon der falsche Ansatz.
Benutz mal unsere SuFu ... da solltest du einen HTTP-Downloader finden. Alternativ kannst du dich auch mal mit der Apache-Commons-Lib auseinandersetzen *Hilfe dazu sollten dir hier einige geben können*.
Wenn du von einem HTTP-Server laden willst kannst du auch mit URL.openConnection() arbeiten und mit instanceof auf HttpURLConnection prüfen. Die nimmt dir einiges ab was HTTP angeht.
-
Ich habe jetzt folgende Lösung die sowohl für CSV als auch ZIP Dateien funktioniert:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public void saveContent(String fileName, String content) throws HttpCommunicationException { if (fileName == null) { throw new NullPointerException("fileName is null!"); } Writer writer = null; try { File file = new File(getDirectory(), fileName); writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1")); writer.write(content); System.out.println(content.getBytes().length + " Bytes geschrieben in " + file.getAbsolutePath()); } catch (FileNotFoundException ex) { throw new HttpCommunicationException(ex); } catch (IOException ex) { throw new HttpCommunicationException(ex); } finally { try { if (writer != null) { writer.close(); } } catch (IOException ex) { throw new HttpCommunicationException(ex); } } }
Stellt es ein Problem dar, wenn ich den FileOutputStream auch für Stringbasierte-Formate benutze? Sollte ich zwischen sollen Formaten unterscheiden beim Schreiben?Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
-
13.10.11 08:51 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Warum hast du den Inhalt denn jetzt als String? Warum verwendest du nicht ein byte Array?
Warum kodierst du das als iso-8859-1? Vermutlich hast du vorher die Daten von der Webseite gelesen, als iso-8859-1 interpretieren lassen und in einen String (welcher UTF-16 ist) gespeichert. Das ist nicht gerade sinnvoll, oder?!
Wenn du von einer URL Daten 1:1 in eine Datei schreiben willst, solltest du überhaupt keine Strings verwenden.
Wenn es sich dabei um text/* handelt, kannst du den Inhalt in einen String konvertieren.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo,
ich arbeite mit dem Apache HTTP Client. Dort gebe ich einen Response Handler an, der den Response erhält und verarbeitet. Dieser Response Handler ist generisch, ich erbe von ihm setzte den Rückgabetyp entweder zu String, wie bisher oder etwas anderem.
Denkst du der Rückgabetyp byte[] wäre sinvoller? Ich müsste dann halt auch Textdateien damit schreiben!Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
-
13.10.11 09:52 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
13.10.11 09:53 #9
Das wäre in der Tat am sinvollsten, da muss ich deepthroat recht geben.
Das byte[] kannst du dann über die writer.write(byte[], 0, byte[].length) schreiben.Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Hallo,
ich arbeite mit dem HTTP Client, dort gibt es die Methoden getResponseBody etc. nicht!
Muss ich den mit Fehlern rechnen wenn ich den Inhalt als String "zwischenspeicher"? Selbst wenn ich ihn beim Schreiben zuerst in ein Byte-Array umwandle, undzwar mit dem selben Charset wie beim erstellen des Strings?
Mein Problem ist das ich im Reponse Handler die Daten verarbeite, und manchmal auch untersuche. Denn die Daten sind ja auch HTML Text, wo ich dann nach bestimmten Informationen suche. Das ist in einem Byte-Array nich so einfach möglich :PWenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
-
13.10.11 11:36 #11
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.
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
13.10.11 12:14 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Wenn du ein falsches Encoding wählst und sich einige Zeichen nicht übersetzen lassen oder nicht eindeutig übersetzen lassen, ja.Code java:1
response.getEntity().writeTo(new FileOutputStream(...));
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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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?Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
-
13.10.11 13:06 #14
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Ja.
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.
Ja.
Du könntest versuchen festzustellen um welches Encoding es sich handelt: http://jchardet.sourceforge.net/
Und ansonsten, halt raten...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
So, danke erstmal für die schnelle und gute Hilfe!
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
// 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?
Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)
watch my blog @ websocialist.blogspot.com
Ähnliche Themen
-
Problem beim Auslesen von ini-files
Von fredlllll im Forum .NET Windows FormsAntworten: 12Letzter Beitrag: 19.02.10, 07:57 -
Problem beim abspielen von AVI Files
Von Starfear im Forum Videoschnitt, Videotechnik & -produktionAntworten: 5Letzter Beitrag: 06.04.08, 14:24 -
MD5sum ändert sich beim Kopieren grosser Files, vorallem über USB
Von lukelukeluke im Forum Microsoft WindowsAntworten: 5Letzter Beitrag: 01.01.08, 17:58 -
MD5sum ändert sich beim Kopieren grosser Files, vorallem über USB
Von lukelukeluke im Forum HardwareAntworten: 1Letzter Beitrag: 27.12.07, 13:57 -
[C++]Problem beim laden von *.x-Files
Von MSAB im Forum C/C++Antworten: 5Letzter Beitrag: 21.08.06, 16:54



7Danke

Zitieren

Login





