Thema: Delphi Datasnap File Upload

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Datasnap File Upload

  Alt 4. Dez 2011, 00:53
Delphi-Quellcode:
var
  aFileStream: TFileStream;
  Buffer: array[1..16*1024] of Byte; // 16 KB
  BytesReadCount: Integer;
begin
  if not DirectoryExists(ExtractFilePath(ParamStr(0)) + 'Files') then
    MkDir(ExtractFilePath(ParamStr(0)) + 'Files\' + Store);
  aFileStream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'Files\' + FileName, fmCreate);
  try
    repeat
      BytesReadCount := str.Read(Buffer, SizeOf(Buffer));
      aFileStream.Write(Buffer, BytesReadCount);
    until BytesReadCount < SizeOf(Buffer);
  finally
    aFileStream.Free;
  end;
end;
Beschreibung:
  • fmCreate überschreibt bestehende Dateien ... es ist also nicht nötig diese vorher zu löschen
  • Das .Create gehört vor den Try-Finally-Block, denn wenn es vor dem .Create schon knallt, dann knallt es im Finally nochmals beim .Free, da die Variable nicht initialisiert hattest.
    > Tipp: Hör auf das, was dir der Compiler sagt, denn der hat dich ganz bestimmt gewarnt.
    Ausnahme: Man initialisiert die Variable vorher entsprechend mit NIL.
  • Dynamische Arrays (z.B. TBytes) und Strings muß man nicht unbedingt manuell freigeben.
    Vorallem wenn Delphi das eine Millisekune später auch nochmal macht ... Im geheimen/unsichtbaren END-Code deiner Methode.
  • Da du eh mit einer Konstanten Puffergröe arbeitest, kannst du den Puffer auch gleich konstannt erstellen.
    > 16 KB sollten locker nich mit noch auf deinen Stack drauf passen ... wenn nicht, dann stimmt eh irgendwo etwas nicht.
  • 1 KB ist eh etwas "suboptimal"
    DataSnap hat standardmäßig einen Übertragungspuffer von 32 KB und auch die Clustergröße deiner Festplatte (die Größe der Verwaltungseinheiten) wird bei dir bestimmt mehr als ein 1 KB sein.
  • Name > FileName
  • das Success ist vollkommen "sinnlos"
    • Erstemal kannst du deine werte direkt an result übergeben und brauchst keine susätzliche Variable.
      (ist nicht wie beim Return in C, PHP, JS und Co., wo bei dessen Zuweisung die Prozedur beendet wird)
    • außerdem gibt dein Resul keinen "sinnvolen" Wert zurück.
      • es gibt True zurück, wenn alles (vermutlich) erfolgreich war
        (ist nicht wie beim Return in C, PHP, JS und Co., wo bei dessen Zuweisung die Prozedur beendet wird)
      • bei einem Fehler gibt es eine Exception und das Result wird nicht verwendet
      Also reicht eine Proedure ... Fehler werden ja eh als Exception zurückgegeben.

      Die Exceptions jetzt abzufangen (try-except) wäre ganz schlimm, denn ein Boolean sagt nur daß etwas falsch lief,
      aber die Exception, welche gesagt hätte was genau nichtr ging, hätte man dann geschrottet.

      Im Server also einfach procedure UploadFile(Stream: TStream; StorePath, FileName: string); verwenden.

PS: Sollte die Datei im Store-Pfad liegen, oder hab ich das falsch verstanden?
Wenn ja, dann muß "Store" natürlich noch mit in den Pfad des TFileStream.Create aufgenommen werden.


Zitat:
Das wird auch jedesmal wenn ich eine neue Methode implementiere überschrieben.
Du mußt das ja auch im Server ändern ... dann wird es im Clienten richtig importiert.
$2B or not $2B

Geändert von himitsu ( 4. Dez 2011 um 01:04 Uhr)
  Mit Zitat antworten Zitat