Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Datasnap büyük dosya gönderme sorunu.
#1
Merhaba. Datasnap ile 4-5 gb dosya göndermeye çalıştığım zaman Filestream yaptığım halde genede aynı memorystream gibi hafızaya doldurmaya başladığının farkına vardım. Tabikide yolun sonu out of memory çıkıyor belli bir yerden sonra. Nerede hata yaptığımı bir türlü çözemedim. Yardımcı olursanız çok sevinirim.


Sunucudaki foksiyonlar.

unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, System.Json,
   DataSnap.DSProviderDataModuleAdapter,
   Datasnap.DSServer, Datasnap.DSAuth;

type
 TServerMethods1 = class(TDSServerModule)
 private
   { Private declarations }
 public
   { Public declarations }
   function SendStream(var Size : Int64): Tstream;
 end;

implementation


{$R *.dfm}


uses System.StrUtils;

function TServerMethods1.SendStream(var Size : Int64): Tstream;
begin
     Result := TFileStream.Create('C:\Users\SeCi\Desktop\Server\Debug\Win32\deneme.zip',
       fmOpenRead or fmShareDenyNone); // dosya boyutu 4 gb.
       Result.position := 0;
       Size:=Result.Size;
end;

Clientte kullandığım methot. (Kendisi direk oluşturdu.)

//
// Created by the DataSnap proxy generator.
// 11.01.2020 05:45:42
//

unit Unit2;

interface

uses System.JSON, Data.DBXCommon, Data.DBXClient, Data.DBXDataSnap, Data.DBXJSON, Datasnap.DSProxy, System.Classes, System.SysUtils, Data.DB, Data.SqlExpr, Data.DBXDBReaders, Data.DBXCDSReaders, Data.DBXJSONReflect;

type
 TServerMethods1Client = class(TDSAdminClient)
 private
   FSendStreamCommand: TDBXCommand;
 public
   constructor Create(ADBXConnection: TDBXConnection); overload;
   constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
   destructor Destroy; override;
   function SendStream(var Size: Int64): TStream;
 end;

implementation

function TServerMethods1Client.SendStream(var Size: Int64): TStream;
begin
 if FSendStreamCommand = nil then
 begin
   FSendStreamCommand := FDBXConnection.CreateCommand;
   FSendStreamCommand.CommandType := TDBXCommandTypes.DSServerMethod;
   FSendStreamCommand.Text := 'TServerMethods1.SendStream';
   FSendStreamCommand.Prepare;
 end;
 FSendStreamCommand.Parameters[0].Value.SetInt64(Size);
 FSendStreamCommand.ExecuteUpdate;
 Size := FSendStreamCommand.Parameters[0].Value.GetInt64;
 Result := FSendStreamCommand.Parameters[1].Value.GetStream(FInstanceOwner);
end;

constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection);
begin
 inherited Create(ADBXConnection);
end;

constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean);
begin
 inherited Create(ADBXConnection, AInstanceOwner);
end;

destructor TServerMethods1Client.Destroy;
begin
 FSendStreamCommand.DisposeOf;
 inherited;
end;

end.


Clientte çağırdığım işlem.

const
 iBufSize = 1048576;
var
 sStr : TStream;
 sMem : TfileStream;
 buf: PByte;
 iRead: integer;
 server : TServerMethods1Client;
 Size : Int64 ;
begin

  server:= TServerMethods1Client.Create( con1.DBXConnection, False);


   sStr := server.SendStream( Size );

   ShowMessage('Size '+IntToStr(Size));

   GetMem(buf, iBufSize);
   sMem := TFileStream.Create('deneme.zip',
       fmcreate or fmShareDenyNone);
   try
     repeat
       iRead := sStr.Read( Pointer(buf)^, iBufSize);

       if iRead > 0 then sMem.WriteBuffer( Pointer(buf)^, iRead);
       if iRead < iBufSize then break;
       Application.ProcessMessages;
       mmo1.Lines.Add(IntToStr(sMem.Size)) ;
     until iRead < iBufSize;
   finally
     FreeMem(buf, iBufSize);
   end;


 FreeAndNil(sStr);
 FreeAndNil(sMem);
end;
Cevapla
#2
4-5 GB'lık bir dosyayı tek seferde göndermeye çalışırsan doğal olarak bu sonuç oluşur. Mantıken dosyayı parçalara ayırarak göndermen lazım. Bunun için de hem sunucu hem de istemci tarafından bu tür özel durumlar için yeni metodlar yazman gerekir.
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#3
(11-01-2020, Saat: 15:52)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.4-5 GB'lık bir dosyayı tek seferde göndermeye çalışırsan doğal olarak bu sonuç oluşur. Mantıken dosyayı parçalara ayırarak göndermen lazım. Bunun için de hem sunucu hem de istemci tarafından bu tür özel durumlar için yeni metodlar yazman gerekir.

Haklısınız hocam bu duruma dikkat etmedim ben. Parça parça göndermeyi yazdım çok teşekkür ederim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  TByteDynArray'den Dosya Oluşturma enes6635 9 975 16-01-2020, Saat: 09:20
Son Yorum: SimaWB
  FireDac ile Mssql Veritabanı Adı sorunu serdar 9 311 15-01-2020, Saat: 23:22
Son Yorum: otonomi
  NetGsm SMS Gönderme smyrna231802 6 212 14-01-2020, Saat: 09:56
Son Yorum: hi_selamlar
  Balloon hint font sorunu. seci20 0 130 25-11-2019, Saat: 15:13
Son Yorum: seci20
  Fastreport barcod yazdirma sorunu TheEAK 16 1.633 21-11-2019, Saat: 12:51
Son Yorum: TheEAK



Konuyu Okuyanlar: 1 Ziyaretçi