Merhaba Arkadaşlar
Bir süredir üzerinde çalıştığım uygulamamda dosya gönderimi yapmak istiyorum bunun için memory stream kullanıyorum ama söyle bir problemim var gönderdiğim dosyayı part part göndermek isterken gönderdiğim dosyada bozulma oluyor ama partı dosya boyutuna eşitlediğim zaman dosyada bozulmadan gönderebiliyorum. Bir çok örnek denememe rağmen part part göndermeye çözüm bulamadım. (Not :Kullandığım versiyon Delphi xe 10.1 up 2)
Bu konuda bilgisi olan arkadaşların yardımlarını bekliyorum. Şimdiden yardımlarınız için teşekkürler iyi çalışmalar.
Aşağıda kodları paylaşıyorum.
Server
Client
alınan resim

Gönderilen resim
Bir süredir üzerinde çalıştığım uygulamamda dosya gönderimi yapmak istiyorum bunun için memory stream kullanıyorum ama söyle bir problemim var gönderdiğim dosyayı part part göndermek isterken gönderdiğim dosyada bozulma oluyor ama partı dosya boyutuna eşitlediğim zaman dosyada bozulmadan gönderebiliyorum. Bir çok örnek denememe rağmen part part göndermeye çözüm bulamadım. (Not :Kullandığım versiyon Delphi xe 10.1 up 2)
Bu konuda bilgisi olan arkadaşların yardımlarını bekliyorum. Şimdiden yardımlarınız için teşekkürler iyi çalışmalar.
Aşağıda kodları paylaşıyorum.
Server
var
tamboyut:int64;
.
.
.
procedure TDosyaal.serverexecute (AContext: TIdContext);
var
mem,files:TMemoryStream;
Dosyaname,yol: string;
begin
if AContext.Connection.IOHandler.ReadLn() = 'Dosya' then
begin
tamboyut:=0;
dosyaname:=AContext.Connection.IOHandler.ReadLn();
tamboyut:=strtoint64(AContext.Connection.IOHandler.ReadLn());
yol:='/sdcard/Download/'+dosyaname;
if DirectoryExists('/sdcard/Download/') = false then
begin
CreateDir('/sdcard/Download/');
end;
files:=TMemoryStream.Create;
end;
if AContext.Connection.IOHandler.ReadLn() = 'Dosya Al' then
begin
mem:=TMemoryStream.Create;
AContext.Connection.IOHandler.ReadStream(mem,tamboyut, true);
mem.Position:=0;
files.CopyFrom(mem,tamboyut);
mem.Free;
end;
if files.Size = tamboyut then
begin
files.SaveToFile(yol);
files.Free;
end;
end;
Client
procedure TDosyayolla.Execute;
var
files:TFileStream;
mem:TMemoryStream;
yol: string;
i,Dosboyut,Boyutcount,tamboyut:integer;
begin
socket:=TIdTCPClient.Create();
socket.OnWork:=SocketWork;
socket.Host:=ip_cek;
socket.Port:=12672;
socket.Connect;
Sleep(500);
if socket.Connected = true then
begin
yol:=Dosya_cek;
files:=TFileStream.Create(yol,fmOpenRead + fmShareDenyNone);
socket.IOHandler.WriteLn('Dosya');
socket.IOHandler.WriteLn(veri_cek);
socket.IOHandler.WriteLn(inttostr(files.Size));
Dosboyut:=0;
Boyutcount:=0;
Dosboyut:=512000; //512 kb
Boyutcount:=files.Size div Dosboyut;
for I := 0 to Boyutcount do
begin
mem:=TMemoryStream.Create;
if (Dosboyut * i) < files.Size then
begin
files.Position:=Dosboyut * i;
if files.Position + Dosboyut < files.Size then
begin
mem.CopyFrom(files,Dosboyut);
end
else
begin
mem.CopyFrom(files,files.Size - files.Position);
end;
end
else
begin
Toast('Değer Fazla',ShortToast);
end;
socket.IOHandler.WriteLn('Dosya Al');
mem.Position:=0;
socket.IOHandler.Write(mem);
mem.Free;
end;
FreeAndNil(Files);
socket.Disconnect;
socket.Free;
durum:='bitti';
end
else
begin
socket.Disconnect;
socket.Free;
end;
end;
alınan resim

Gönderilen resim



