AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe mit Delphi [idhttp.get error]

Ein Thema von RooT314 · begonnen am 31. Mär 2015 · letzter Beitrag vom 1. Apr 2015
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 07:38
Ich sehe nicht, wo da irgendetwas gespeichert wird. Du liest den Inhalt einer Webseite in einen Stream und gibst den gleich wieder frei. Dazwischen müsste der Stream seinen Inhalt aber erstmal noch speichern (s. Write oder WriteBuffer).
Lies doch erstmal den Text der Online-Hilfe zu TFileStream.Create, bevor du da was behauptest:
fmCreate – Erstellt eine Datei mit dem angegebenen Namen. Ist eine Datei mit diesem Namen bereits vorhanden, wird die Datei zum Schreiben geöffnet.
Das heißt: In dem Moment, in dem du in einen geöffneten Filestream was reinschreibst, wird das auf Platte geschrieben. Ich mach das seit Jahr und Tag mit meiner Blob-To-File-Funktion ganz genau so:
Delphi-Quellcode:
Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
Var
  S : TStream;
  FileS : TFileStream;

begin
  Result := False;

  If Not Feld.IsBlob Then
  Begin
    GLD.Fehlertext := 'Das angegebene Feld ist kein Blobfeld.';
    Exit;
  End;

  If Feld.IsNull Then
  Begin
    GLD.Fehlertext := 'Im angegebenen Blobfeld des aktuellen Records befinden sich keine Daten.';
    Exit;
  End;

  S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
  FileS := TFileStream.Create(Datei, fmCreate);

  Try
    Try
      FileS.CopyFrom(S, S.Size);
      Result := FileExists(Datei);
    Except
      on e:exception Do
      Begin
        GLD.FehlerText := 'Fehler bei BlobToFile: ' + e.Message;
        Result := False;
      End;
    End;
  Finally
    S.Free;
    FileS.Free;
  End;
end;
Außerdem gibst du dem Stream beim create lediglich ein Verzeichnis an und keinen vollständigen Dateinamen.
Das dürfte wohl eher die Fehlerursache sein ...
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
733 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 07:58
fmCreate – Erstellt eine Datei mit dem angegebenen Namen. Ist eine Datei mit diesem Namen bereits vorhanden, wird die Datei zum Schreiben geöffnet.
Das heißt: In dem Moment, in dem du in einen geöffneten Filestream was reinschreibst, wird das auf Platte geschrieben.
OK, dass das so funktioniert, wusste ich nicht, gebe ich zu. Aber aus der Hilfe lese ich das auch nicht. Da steht nur, dass die Datei zum Schreiben geöffnet wird, und nicht das da auch automatisch was reingeschreiben wird, wenn man in den Stream was reinschreibt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:25
@Perlsau: Nur im Unterschied zum Threadersteller schreibst du auch was rein FileS.CopyFrom(S, S.Size);
Delphi-Quellcode:
 edit1.Text := (dir);
...
...
...
ResponseStream := TFileStream.Create(Edit1.Text, fmCreate);
Jetzt rate mal wie die Datei heißt und wo sie liegt?

Ausgewählte Verzeichnis: c:\ddd\eee -> Dateiname eee im Verzeichnis c:\ddd. Ich glaube kaum, dass das funktionieren wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:32
OK, dass das so funktioniert, wusste ich nicht, gebe ich zu.
Tja, man lernt nie aus, das gilt für mich ebenso

Aber aus der Hilfe lese ich das auch nicht.
Und wo hast du das mit dem WriteBuffer gelesen? Etwa in der Online-Hilfe zu TFileStream?

Da steht nur, dass die Datei zum Schreiben geöffnet wird, und nicht das da auch automatisch was reingeschreiben wird, wenn man in den Stream was reinschreibt.
Zum Schreiben geöffnet heißt, sie wird erstellt und wartet darauf, daß geschrieben wird. Wie befüllt man ein geöffnetes Gefäß? Indem man was reingießt? Und wie schreibt man in einen Filestream? Indem man was reinkopiert? Also für mich ist der Text in der OH eindeutig.

Man sollte hier wirklich nichts behaupten, das man nicht zuvor überprüft hat, nur um sich hervorzutun mit einem "ich weiß auch was" und sich dann doch zu blamieren

Übrigens kann man im Codebeispiel zu TFileStream.Create genau diese Vorgehensweise finden.

@Perlsau: Nur im Unterschied zum Threadersteller schreibst du auch was rein FileS.CopyFrom(S, S.Size);
Und macht das der TE mit idHTTP1.Get(url, ResponseStream); etwa nicht? Was macht die Get-Version mit String als Var-Parameter? Richtig, das Resultat wird im String gespeichert. Warum sollte es bei einem Stream als Ziel-Behälter dann anders sein?

AResponseContent is the TStream instance that is the destination for data retrieved from the specified URL. For example: AHttp.Get(AUrl, AResponseContent)

Geändert von Perlsau ( 1. Apr 2015 um 08:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 08:39
Ok, überlesen. Aber letztendlcih wird es daran scheitern dass ein Verzeichnis übergeben wird und kein Dateiname.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#6

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:04
Noch besser, das "dir" ist erstmal ein "path", denn dir := ExtractFilePath(Application.ExeName); , aber hier passt Vieles nicht so ganz.
  • erst wird in "dir" ein Pfad "path" reingeschrieben ( C:\dir\ )
  • dann noch der falsche Dialogtext "Bitte ein Verzeichnis auswählen" > Ergibt ein "dir" ( C:\dir\dir2 ), aber nur wenn man den Editinhalt ändert und nicht so belässt
  • Bezogen auf SelectDirectory stimmt der Text zwar, aber in "dir" Edit1 (echt blöde Name) soll doch ein Dateiname (samt path) rein ... warum dann kein TOpenDialog?
  • und zum Schluß wird das Verzeichnis "dir" auch noch direkt als Dateiname "file" verwendet ( C:\dir\file )
  • wenn wirklich ein Vereichnis (dir oder path) in "dir" und Edit1 rein soll, dann muß das eben bei TFileStream um den Dateinamen ergänzt werden




PS: @BlobFeldInDatei
Result := FileExists(Datei); ist etwas sinnlos nutzlos, denn es muß zwangsläufig immer True zurückgeben.
Entweder knallte das TFileStream.Create und der Code kommt dort nie vorbei, oder TFileStream.Create(fmCreate) war erfolgreich und die Datei ist somit auch vorhanden.

Wenn TFileStream.Create knallt, dann bleibt auch noch der Blob-Stream schön als Speicherleck zurück.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Apr 2015 um 09:09 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:35
PS: @BlobFeldInDatei
Result := FileExists(Datei); ist etwas sinnlos nutzlos, denn es muß zwangsläufig immer True zurückgeben.
Entweder knallte das TFileStream.Create und der Code kommt dort nie vorbei, oder TFileStream.Create(fmCreate) war erfolgreich und die Datei ist somit auch vorhanden.
Wenn TFileStream.Create knallt, dann bleibt auch noch der Blob-Stream schön als Speicherleck zurück.


Du meinst, das TFileStream.Create gehört in den Try-Finally-Block? Klingt logisch, werde ich gleich mal ändern. Dann macht auch Result := FileExists(Datei); Sinn, obwohl ich da natürlich genausogut schreiben könnte Result := True; .
Du hast meinen Code verbessert, dafür sei dir mein Dank gewiß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#8

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:43
Jupp, aber dann vor dem Try natürlich nicht das :=nil vergessen, denn sonst knallt auch noch das Free, da nicht initialisiert, wenn es im Create knallte.
2x Try-Finally, oder Create drinnen und davor initialisieren.

Sinn: Nja, wenn es im Create knallt, kommt es dennoch nicht beim Exists vorbei, außer Exists steckt im finally.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Apr 2015 um 09:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Hilfe mit Delphi [idhttp.get error]

  Alt 1. Apr 2015, 09:51
Generell sollte man sowas etwas mehr trennen:
Delphi-Quellcode:
procedure TDatMod.DoStoreBlobToFile(Feld: TField; Datei: String);
Var
  S : TStream;
  FileS : TFileStream;
begin
  If Not Feld.IsBlob Then
    raise Exception.Create( 'Das angegebene Feld ist kein Blobfeld.' );

  If Feld.IsNull Then
    raise Exception.Create( 'Im angegebenen Blobfeld des aktuellen Records befinden sich keine Daten.' );

  S := nil;
  FileS := nil;
  Try
    S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
    FileS := TFileStream.Create(Datei, fmCreate);
    FileS.CopyFrom(S, S.Size );
  Finally
    S.Free;
    FileS.Free;
  End;
  if not FileExists( Datei ) then
    raise Exception.CreateFmt( 'Eigentlich sollte die Datei "%s" jetzt vorhanden sein?', [Datei] );
end;

Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
begin
  Result := True;
  try
    DoStoreBlobToFile( Feld, Datei );
  except
    on E: Exception do
    begin
      GLD.FehlerText := E.Message;
      Result := False;
    end;
  end;
end;
Schon wird es kürzer und knackiger, obwohl es jetzt zwei Methoden sind
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Apr 2015 um 09:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz