Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text (https://www.delphipraxis.net/134677-idhttp-defekte-zeilenumbrueche-0a-statt-0d0a-bei-text.html)

moelski 26. Mai 2009 21:45


IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Moin !

Ich lade Dateien mit IdHTTP von einem Server. Der Code sieht im Prinzip so aus:
Delphi-Quellcode:
  lStream := TFileStream.Create(TargetFolder + Filename, fmCreate or fmShareDenyNone);
  lStream.Position := 0;

  repeat
    // Damit sich das Programm nicht aufhängt
    Application.ProcessMessages;

    //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize
    if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then
      //Hier wird einmal die cFileSplitSize eingestellt
      IdHttp.Request.Range := Format('%d-%d', [BytesKopiert, (BytesKopiert+cFileSplitSize-1)])
    else
      IdHttp.Request.Range := Format('%d-' , [BytesKopiert]);

    Application.ProcessMessages;

      //Den eingesttelten Teil herunterladen und ihn die Datei speichern
      IdHTTP.Get(FileToLoad , lStream);
      BytesKopiert := BytesKopiert+cFileSplitSize;

    Application.ProcessMessages;
  until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig

  if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
Das funzt auch ganz gut soweit. Die Dateien werden in Blöcken geladen.
Nun habe ich aber z.B. bei Textdateien das Problem das die Zeilenumbrüche nicht 0D0A sind sondern auf 0A gestutzt werden.
Andere Dateien hingegen werden allerdings problemlos geladen. Wenn ich z.B. eine EXE übertrage ist alles ok.

Nun stellt sich mir die Frage ... Liegt das an TFileStream oder an IdHTTP? Und was kann ich dagegen tun?
Muss ich ggf. beim Stream Create einen zusätzlichen Parameter angeben?
Braucht IdHttp evtl. eine spezielle Einstellung?

Im Grunde will ich ja nur Dateien als Binärstream downloaden.

@Mod: Sollte das eher an IdHTTP liegen, bitte ins Internet Forum verschieben - Sorry.

Satty67 26. Mai 2009 21:58

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Ist die Textdatei von Dir, also waren vorher CRLF drin? Glaube Unix/Linux Textdateien verwenden nur LF (0A) beim Zeilenumbruch.

moelski 26. Mai 2009 21:59

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Jep, die Textdatei is von mir. Und da ist alles mit 0D0A.

Ich glaube aber fast eher das es an IdHTTP liegt ...
Kann es wohl sein das ich den ContentType angeben muss ?

mkinzler 26. Mai 2009 22:00

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Und beim Mac nur OD

BUG 26. Mai 2009 22:02

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Evtl. vergurkt es der Server. Verpass der Datei mal eine andere Endung (z.B. ".bin") und probiere die herunterzuladen.

MfG,
Bug

moelski 26. Mai 2009 22:12

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Moin !

Mit .BIN am Ende fehlen auch die 0D's.

Merkwürdig ist aber wenn ich es im Browser aufrufe stimmt alles:
http://www.logview.info/Update/LogView%20V2/i_about.txt

Also kann es ja eigentlich nicht am Server liegen.

BUG 26. Mai 2009 22:17

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von moelski
Merkwürdig ist aber wenn ich es im Browser aufrufe stimmt alles:

Echts? Bei mir sind da nur Unix-Zeilenumbrüche :gruebel:

MfG,
Bug

moelski 26. Mai 2009 22:26

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Moin !

Sowohl im IE8, Firefox und Download / Anzeigen per FTP habe ich normale Umbrüche (0D0A).
So ein Mist ... Kann doch nich angehen das der Server an den Daten rumfummelt. Das wäre ja ein Unding.

Ich denke doch eher das es an IdHTTP liegt und das dort die codierung irgendwie falsch ist.
Aber ich weiss leider nicht ob dem so ist und was ich wenn anpassen müsste :pale:

DP-Maintenance 26. Mai 2009 22:27

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Sonstige Fragen zu Delphi" nach "Internet / LAN / ASP.NET" verschoben.
Passt hier besser

moelski 26. Mai 2009 22:28

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
@mkinzler: Danke.
Ich glaube auch fast das es hier besser aufgehoben ist.

moelski 26. Mai 2009 22:39

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Moin !

Es hilft auch nix wenn ich anstatt von TFileStream einen TMemoryStream nutze und denn dann mittels SaveToFile auf Platte schreibe.
Das Ergebnis ist das gleiche - die 0D fehlen :evil:

Ich vermute doch ziemlich stark das es an der IdHTTP Komponente liegt bzw. einem fehlenden Parameter. :gruebel:

Neutral General 26. Mai 2009 22:54

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Hi,

Wenn ich mich nicht irre (was durchaus sein kann), dann liegt es am Server oder/und an FTP. Wenn auf dem Server ein Unix Betriebssystem installiert ist, dann werden in allen Textdateien (bzw alle nicht-Binärdateien) die Zeilenumbrüche "konvertiert". Das ist meines Wissens ganz normal. Ich gehe davon aus, dass die aktuellen Browser damit klar kommen. Aber durch pures herunterladen dieser Textdateien mit HTTP bekommst du die Dateien genau so wie sie auf dem Server gespeichert sind: Mit Unix-Zeilenumbrüchen. Problem kannst du entweder beheben, indem du die Datei mit einer FTP Komponente runterlädst (denk ich mal) oder du lässt ein einfaches StringReplace auf die Textdatei los nachdem du sie runtergeladen hast.

Gruß
Neutral General

Satty67 26. Mai 2009 23:23

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Zitat:

Zitat von moelski
Merkwürdig ist aber wenn ich es im Browser aufrufe stimmt alles:
http://www.logview.info/Update/LogView%20V2/i_about.txt

In FireFox sieht die Datei korrekt aus, lade ich die aber runter (Rechtsklick -> Speichern unter) sind alle Zeilen nur mit 0A abgeschlossen.

Die Datei wird also nur mit 0A als Zeilenumbruch vom Server angeboten.

Neutral General 27. Mai 2009 00:22

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Zitat:

Zitat von Satty67
Zitat:

Zitat von moelski
Merkwürdig ist aber wenn ich es im Browser aufrufe stimmt alles:
http://www.logview.info/Update/LogView%20V2/i_about.txt

In FireFox sieht die Datei korrekt aus, lade ich die aber runter (Rechtsklick -> Speichern unter) sind alle Zeilen nur mit 0A abgeschlossen.

Die Datei wird also nur mit 0A als Zeilenumbruch vom Server angeboten.

Meine Worte ;)

BUG 27. Mai 2009 00:35

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Erster :tongue: :
Zitat:

Zitat von BUG
Bei mir sind da nur Unix-Zeilenumbrüche :gruebel:

Du könntest versuchen, die Datei im binärmodus mit FTP hochzuladen, oder ...
Zitat:

Zitat von Neutral General
... du lässt ein einfaches StringReplace auf die Textdatei los nachdem du sie runtergeladen hast ...

... was ich für zielführender halte: Schließlich willst du dich bestimmt nicht jedes mal mit dem Server rumschlagen wenn du die Datei aktualisierst.


MfG,
Bug

Satty67 27. Mai 2009 06:56

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
War ja schon spät :oops:

Auf jeden Fall seltsam, das selbst eine umbenannte Datei (er sagt ja, er hat sie selbst als *.bin hoch geladen), von 0D0A nach 0A Umbrüche gewandelt wird. Um die eigene Procedure zu Testen (die wohl funktioniert), würde ich mal Server und Text-Datei ändern (sollte was in dem riesigen Internet zu finden sein).

moelski 27. Mai 2009 07:10

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Moin Männers,

ich werde mal ne Mail an meinen Hoster schicken.
Mal sehen was die zu der Sache sagen.

Hätte auch schon ne passabele Lösung ... Ich lege alle Dateien gezippt ab. Dadurch würde sich auch der Downloadtraffic reduzieren.

nahpets 27. Mai 2009 08:49

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Hallo,

mit
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
          fs : TFileStream;
begin
  fs := TFileStream.Create('c:\About.xxx',fmCreate );
  idhttp1.Get('http://www.logview.info/Update/LogView%20V2/i_about.txt',fs);
  fs.Free;
end;
und
Delphi-Quellcode:
object IdHTTP1: TIdHTTP
  MaxLineAction = maException
  ReadTimeout = 0
  AllowCookies = True
  ProxyParams.BasicAuthentication = False
  ProxyParams.ProxyPort = 0
  Request.ContentLength = -1
  Request.ContentRangeEnd = 0
  Request.ContentRangeStart = 0
  Request.ContentType = 'text/html'
  Request.Accept = 'text/html, */*'
  Request.BasicAuthentication = False
  Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
  HTTPOptions = [hoForceEncodeParams]
  Left = 328
  Top = 96
end
erhalte ich die Datei mit 0D0A. Indyversion: Die mit Delphi 7 geliefert 9.
Den Browsern ist der Zeilenumbruch schnuppe (da er für die Darstellung nicht benötigt wird).
Für den Download dürfte die Dateiendung irrelevant sein, sie hat unter Unix keinerlei Bedeutung. Eventuell ist da die Benutzung eines entsprechenden Contenttypes eher zielführend.

moelski 27. Mai 2009 09:50

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Moins !

So ich habe Post bekommen vom Hoster :)
Das Problem liegt am FTP Upload (wie hier schon vermutet wurde). Im ASCII Mode passt der einfach mal die Dateien an. So ein Muff.

Nuja, ich habe jetzt die Dateien Binär übertragen und das problem ist weg. Die Alternative ist nach wie vor, alle Dateien zu zippen. Aber das ist dann eine neue Baustelle. Im Moment komme ich sehr gut mit dem Binär Transfer klar. Muss man eben nur wissen das ... :cyclops:

@nahpets:
Zitat:

erhalte ich die Datei mit 0D0A.
Das liegt vermutlich daran das ich die Datei inzwischen im Binär Mode neu übertragen habe.

Klaus01 27. Mai 2009 09:52

Re: IdHttp - defekte Zeilenumbrüche (0A statt 0D0A) bei Text
 
Zitat:

Zitat von moelski
.. Das Problem liegt am FTP Upload (wie hier schon vermutet wurde). Im ASCII Mode passt der einfach mal die Dateien an. So ein Muff.

Das macht, so weit ich das weiß, aber jeder FTP Client bzw. Server
wenn Ascii Daten zwischen der Windows und der Unix/Linux Welt ausgetauscht werden.

Bei dem Download via HTTP ist mir so ein Verhalten nicht bekannt.

Grüße
Klaus

Reinhard Kern 27. Mai 2009 15:56

Re: TFileStream - defekte Zeilenumbrüche (0A statt 0D0A)
 
Zitat:

Zitat von BUG
Erster :tongue: :
Zitat:

Zitat von BUG
Bei mir sind da nur Unix-Zeilenumbrüche :gruebel:

Du könntest versuchen, die Datei im binärmodus mit FTP hochzuladen, oder ...
Zitat:

Zitat von Neutral General
... du lässt ein einfaches StringReplace auf die Textdatei los nachdem du sie runtergeladen hast ...

... was ich für zielführender halte: Schließlich willst du dich bestimmt nicht jedes mal mit dem Server rumschlagen wenn du die Datei aktualisierst.


MfG,
Bug

Hallo,

Unix verwendet nicht nur LF-Only als Zeilenumbruch, es richtet sich auch üblicherweise nicht nach Extensions, um den Typ zu erkennen, sondern bestimmt ihn nach dem Inhalt selbst - daher nützt das Umbenennen in .BIN bei echten Unixsystemen nichts, die halten das trotzdem für Text.

Es gibt aber auch Editoren, die das richtig einlesen, so weit ich mich erinnern kann gehört auch das mitgelieferte WordPad dazu; sowas verwende ich eben für Unix-Texte, ist am einfachsten.

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz