K
konstin
Добрый вечер, тема не новая, но после прочтения кучи форумов в голове настоящая каша. Необходимо осуществить передачу файла от клиента к серверу, после чего сервер его просто сохраняет.
Пробывал по разному и остановился на:
клиент
1. передаем имя файла
2. передаем размер в байтах
3. читает файл в поток;
4. отсылаем поток на сервер
begin
if main.client.Socket.Connected = true then
begin
main.client.Socket.WriteLn('-send file'); // команда
main.client.Socket.WriteLn(ExtractFileName(sOpenDialog1.FileName)); // имя
main.client.Socket.WriteLn(inttostr(GetFileSize(sOpenDialog1.FileName)));
// размер
fs := TfileStream.Create(sOpenDialog1.FileName, fmOpenRead );
main.client.Socket.WriteBufferOpen;
main.client.Socket.write(fs);
main.client.Socket.WriteBufferFlush;
main.client.Socket.WriteBufferClose;
end;
fs.Free;
end;
сервер:
1. Ждем команды от постоянно подключенного клиента, если пришло '-send file' то начинаем принимать файл
2. читаем в рекорд имя
3. читаем в рекорд размер в байтах
4. созздаем файловый поток
5. читаем в этот поток данные
begin
com := AContext.Connection.Socket.ReadLn;
if AnsiContainsStr(com, '-send file') then
begin
main.log(com);
fi.name := AContext.Connection.Socket.ReadLn;
main.log(fi.name);
fi.size := AContext.Connection.Socket.ReadLn;
main.log(fi.size);
try
fs := TFileStream.Create(fi.name, fmCreate or fmShareDenyRead);
AContext.Connection.IOHandler.ReadStream(fs);
//
fs.f
finally
fs.Free;
end;
end;
end;
Файл вроде как и создается но... всегда фиксированного размера... видимо стандартный размер буфера - 1,25 гб. При этом если резко ракрыть клиент то файл принимает свой размер, но чаще всего поврежден. Если кидать допустим исошку в 4 гб то он естественно выводит что памяти нехватает... но как разбить поток на части или вобщем его передать придумать не могу. На клиенте пробывал копировать поток в поток и так его отправлять но сервер все равно видит его как единое целое
Пробывал по разному и остановился на:
клиент
1. передаем имя файла
2. передаем размер в байтах
3. читает файл в поток;
4. отсылаем поток на сервер
begin
if main.client.Socket.Connected = true then
begin
main.client.Socket.WriteLn('-send file'); // команда
main.client.Socket.WriteLn(ExtractFileName(sOpenDialog1.FileName)); // имя
main.client.Socket.WriteLn(inttostr(GetFileSize(sOpenDialog1.FileName)));
// размер
fs := TfileStream.Create(sOpenDialog1.FileName, fmOpenRead );
main.client.Socket.WriteBufferOpen;
main.client.Socket.write(fs);
main.client.Socket.WriteBufferFlush;
main.client.Socket.WriteBufferClose;
end;
fs.Free;
end;
сервер:
1. Ждем команды от постоянно подключенного клиента, если пришло '-send file' то начинаем принимать файл
2. читаем в рекорд имя
3. читаем в рекорд размер в байтах
4. созздаем файловый поток
5. читаем в этот поток данные
begin
com := AContext.Connection.Socket.ReadLn;
if AnsiContainsStr(com, '-send file') then
begin
main.log(com);
fi.name := AContext.Connection.Socket.ReadLn;
main.log(fi.name);
fi.size := AContext.Connection.Socket.ReadLn;
main.log(fi.size);
try
fs := TFileStream.Create(fi.name, fmCreate or fmShareDenyRead);
AContext.Connection.IOHandler.ReadStream(fs);
//
fs.f
finally
fs.Free;
end;
end;
end;
Файл вроде как и создается но... всегда фиксированного размера... видимо стандартный размер буфера - 1,25 гб. При этом если резко ракрыть клиент то файл принимает свой размер, но чаще всего поврежден. Если кидать допустим исошку в 4 гб то он естественно выводит что памяти нехватает... но как разбить поток на части или вобщем его передать придумать не могу. На клиенте пробывал копировать поток в поток и так его отправлять но сервер все равно видит его как единое целое