【发布时间】:2013-12-16 15:24:39
【问题描述】:
我正在使用 tidtrivialftp 服务器 n tidtrivialftp 进行 p2p 文件传输,它适用于文本文件传输,但是当我尝试 docx 和 pdf 文件时,虽然文件已传输但无法打开或 PDF 说它已损坏。正如此链接所说@ 987654321@
"TIdTrivialFTP 客户端基于普通文件传输协议。此客户端 可用于连接到 TFTP 服务器。 TFTP 不适用于一般文件传输,因为它 是一个非常轻量级的文件传输协议。它通常仅限于 LAN 并用于 简单的任务,例如从路由器上传/下载路由表。因为 本协议性质,需要认证时不推荐使用 或一般需要任何类型的安全性”。
TIdTrivialFTP 和 TFTP 是不是不同,或者上面的文本是否相同?
这里是代码
客户:
procedure TForm2.LoadClick(Sender: TObject);
begin
OpenDialog1.InitialDir := GetCurrentDir;
if OpenDialog1.Execute then
begin
Edit1.Text := OpenDialog1.FileName;
path := Edit1.Text; // save path for sending
end;
end;
procedure TForm2.sendClick(Sender: TObject);
var
size: Word;
index: Word;
buffer: TIdBytes;
begin
stream := TFileStream.Create(path,fmOpenRead or fmShareDenyWrite);
try
setlength(buffer, stream.Size);
stream.ReadBuffer(buffer, Length(buffer));
stream.Position := 0;
Client1.Put(stream, ExtractFileName(path));
finally
stream.Free;
end;
end;
procedure TForm2.client1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
Memo1.Lines.Add(IntToStr(AWorkCount));
end;
procedure TForm2.client1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
Memo1.Lines.Add('Transmitting data...');
end;
procedure TForm2.client1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
Memo1.Lines.Add('Transfer complete...');
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
server.Create;
server.ThreadedEvent := True;
server.Active := True;
server.Bindings.Add.Port := 69;
Client1.Host := '';
Client1.Port := 69;
end;
服务器:
procedure TForm2.serverWriteFile(Sender: TObject; var FileName: string;
const PeerInfo: TPeerInfo; var GrantAccess: Boolean; var AStream: TStream;
var FreeStreamOnComplete: Boolean);
var
FS: TFileStream;
begin
SaveDialog1.FileName := ExtractFileName(FileName);
if SaveDialog1.Execute then
begin
// let TIdTrivialFTPServer create the TFileStream internally...
FileName := SaveDialog1.FileName;
Memo1.Lines.Add('started writing files...');
// file1 := ExtractFileName(Filename);
{ Open file in WRITE ONLY mode }
FS := TFileStream.Create(TFTPPath + Filename,fmCreate or fmShareExclusive);
{ Copy all the data }
AStream := FS;
{ Set parameters }
FreeStreamOnComplete := True;
end
else
GrantAccess := False;
end;
【问题讨论】:
-
请出示您的代码。
TransferMode属性可以设置为tfNetAscii,它适用于 ASCII 文本文件,tfOctet,它适用于二进制数据。提示:FTP 有类似的设置/模式。 -
我需要一个通用的文件传输协议。代码在上面添加。
-
@Marcus 它设置为 tfoctet。
-
@MarcusAdams:
TransferMode实际上不是由TIdTrivialFTP或TIdTrivialFTPServer实现的。尽管TIdTrivialFTP将TransferMode发送到TFTP 服务器,并且TIdTrivialFTPServer确实提取了接收到的TransferMode,但这两个组件实际上都没有使用指定的模式。他们都只在tfOctet模式下进行传输。
标签: delphi delphi-xe3