本文目录一览:
- 1、delphi如何上传文件到web服务器
- 2、【DELPHI】如何在两台电脑间传送文件?
- 3、Delphi编写文件传输的实现方法?
- 4、Delphi 文件传输
- 5、Delphi中,怎么使用FTP主动下传文件
- 6、DELPHI实现服务端与客户端之间进行文件夹传输
delphi如何上传文件到web服务器
上传有两种,一种是用ftp控件,需要有帐号和密码来上传文件。优点是方便,缺点是别人用一些监听工具可以拦截到你的帐号和密码。
另一种是用asp(或其它)写一个上传脚本,然后delphi调用这个页面,直接实现上传。就跟某些论坛上发贴可以带附件一样。优点是安全。缺点是“不是每个人既会delphi又会asp”。
【DELPHI】如何在两台电脑间传送文件?
Delphi 实现传送文件
1.建立两个工程Server及Client
分别放TServerSocket及TClientSocket控件,Demo,Edit控件等。
2.设置TServerSocket name为 SS, ServerType为stNonBlocking,TClientSocket name为cs,ClientType为ctNonBlocking表示异步读写信息。注意ClientType和ServerType要相一致.若为ctBlocking则表示同步读写信息。-网络文件传输delphi
3.Socket传送文件的顺序图
a)Client--Server MP_QUERY
b)Server--Client MP_ACCEPT
c) Client--Server MP_FileProperty
d)Server--Client MP_NextWillBeData
e)Client--Server MP_NextWillBeData
f)Server--Client MP_DATA
g) Client--Server 发送数据
h) Server接收数据并处理
i)Client--Server MP_END结束
4.Client端代码------------------------------------------------------------------------------------------------------------------网络文件传输delphi
unit UnitClient;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, Buttons, ExtCtrls, ComCtrls;
Const
//设置协议标志符
//标志将要发送文件名
MP_QUERY ='aaaaa';
//标志服务器拒绝接收
MP_REFUSE ='bbbbb';
//标志服务器同意接收文件
MP_ACCEPT ='ccccc';
//标志将要传递数据
MP_NEXTWILLBEDATA='ddddd';
//标志服务器端准备接收数据
MP_DATA ='eeeee';
//标志客户端取消了本次发送操作
MP_ABORT ='fffff';
//标志已经发送完毕
MP_END='iiiii';
//标志发送的文件长度
MP_FILEPROPERTY='jjjjj';
//指定每次发送包的大小
iBYTEPERSEND=1024;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
cs: TClientSocket;
Panel1: TPanel;
btnSendFile: TBitBtn;
edtIPAddress: TEdit;
Memo1: TMemo;
edtHostName: TEdit;
RB1: TRadioButton;
RB2: TRadioButton;
ProBar: TProgressBar;
Btncancel: TBitBtn;
Btnexit: TBitBtn;
procedure btnSendFileClick(Sender: TObject);
procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure BtncancelClick(Sender: TObject);
procedure BtnexitClick(Sender: TObject);
private
//定义一个发送文件的数据流
fsSend: TFileStream;
//设置开始状态位
tStart:Boolean;
//标识当前时间
TickCount:Longword;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//发送文件
procedure TForm1.btnSendFileClick(Sender: TObject);
begin
//关闭套接字连接
cs.Close;
//初始化进程条
Probar.Position:=0;
if RB1.Checked then
begin
cs.Host:='';
//指定要连接的主机IP地址
cs.Address:=edtIPAddress.Text;
end
else
//指定要连接的主机名
cs.Host:=edtHostName.Text;
//要连接的主机所用端口号
cs.Port:=2000;
//打开套接字连接
cs.Open;
//点击发送确认按钮
if OpenDialog1.Execute then
Begin
//发送连接请求
cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);
end;
end;
//客户端接收来自服务器端的信息
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
MsgRecv:string;
bufSend:pointer;
iLength:Integer;
begin
//得到客户端发来的信息
MsgRecv:=Socket.ReceiveText;
//取前5位,得到协议标志符
MsgRecv:=copy(MsgRecv,1,5);
//接收到拒绝信息
if MsgRecv=MP_REFUSE then
memo1.Lines.Add('连接请求被拒绝!')
//接收到确认接收信息
else if MsgRecv=MP_ACCEPT then
begin
//为要发送的文件创建文件流
fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
tStart:=False;
//进度条显示
Probar.Max:=fsSend.Size;
memo1.Lines.Add('开始发送!');
//获取发送开始时的时间
TickCount:=GetTickCount;
//创建文件流并发送文件长度。
Socket.SendText(MP_FILEPROPERTY+inttostr(Trunc(fsSend.Size/iBYTEPERSEND)+1));
end
else if MsgRecv=MP_NEXTWILLBEDATA then
begin
//通知接收端将要传送数据。
Socket.SendText(MP_NEXTWILLBEDATA);
end
else if MsgRecv=MP_DATA then
begin
//接收到确认信息,开始发送数据。
if not tStart then
begin
memo1.Lines.Add('发送数据中... ...');
tStart:=True;
end;
//还有数据没有发送。
if fsSend.Position fsSend.Size-1 then
begin
iLength:=fsSend.Size-1-fsSend.Position;
//将数据分段发送
if iLengthiBYTEPERSEND then
iLength:=iBYTEPERSEND;
GetMem(bufSend,iLength+1);
try
//读取文件流数据
fsSend.Read(bufSend^,iLength);
//发送长度为iLength的数据
Socket.SendBuf(bufSend^,iLength);
//进度条显示
Probar.Position:=fsSend.Position;
finally
//释放内存
FreeMem(bufSend,iLength+1);
end;
//发送完毕
end else
begin
//通知主机文件传送结束。
Socket.SendText(MP_END);
memo1.Lines.Add('发送完成!');
//获取发送耗时
memo1.Lines.Add('发送耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
fsSend.Free;
end;
//取消文件发送过程
end else if MsgRecv=MP_ABORT then
begin
memo1.Lines.Add('中止!');
//文件传送取消
fsSend.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
end;
//取消
procedure TForm1.BtncancelClick(Sender: TObject);
begin
//取消文件发送过程
cs.Socket.SendText(MP_ABORT);
end;
procedure TForm1.BtnexitClick(Sender: TObject);
begin
Form1.Close;
end;
end.
5.Server端代码-------------------------------------------------------------------------------------------------网络文件传输delphi
unit UnitServer;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ScktComp, ExtCtrls;
Const
//设置协议标志符
//标志将要发送文件名
MP_QUERY ='aaaaa';
//标志服务器拒绝接收
MP_REFUSE ='bbbbb';
//标志服务器同意接收文件
MP_ACCEPT ='ccccc';
//标志将要传递数据
MP_NEXTWILLBEDATA='ddddd';
//标志服务器端准备接收数据
MP_DATA ='eeeee';
//标志客户端取消了本次发送操作
MP_ABORT ='fffff';
//标志已经发送完毕
MP_END='iiiii';
//标志发送的文件长度
MP_FILEPROPERTY='jjjjj';
//指定每次发送包的大小
iBYTEPERSEND=1024;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
ss: TServerSocket;
Memo1: TMemo;
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
//定义一个接收文件的数据流
fsRecv:TFileStream;
//设置开始状态位
tStart:Boolean;
//标识当前时间
TickCount:Longword;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//服务器端接收来自客户端的信息
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
msgr,theFileName:string;
bufRecv:Pointer;
iLength:Integer;
begin
//接收到的数据的长度
iLength:=Socket.ReceiveLength;
//开辟一块新的内存,用来保存接收到的数据
GetMem(bufRecv,iLength);
try
//接收数据
Socket.ReceiveBuf(bufRecv^,iLength);
//将接收到的数据以字符串的形式存到msgr中
msgr:=StrPas(PChar(bufRecv));
//取前5个字符
msgr:=Copy(msgr,1,5);
if msgr=MP_QUERY then
begin
//去掉字符串前后的空格和控制字符
msgr:=Trim(StrPas(PChar(bufRecv)));
//第5个字符后面的字符串为文件名
theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr)));
SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:';
SaveDialog1.FileName:=theFileName;
//点击确认保存按钮
if SaveDialog1.Execute then
begin
//为需保存的文件创建文件流
fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
//如果同意接收数据。
memo1.Lines.Add ('开始接收!');
TickCount:=GetTickCount;
//发送同意接收文件的信息
Socket.SendText(MP_ACCEPT);
tStart:=False;
end
else
//发送拒绝接收文件的信息
Socket.SendText(MP_REFUSE);
end
else if msgr=MP_FILEPROPERTY then
begin
//接收文件长度并说明主机可以接收数据了
Socket.SendText(MP_NEXTWILLBEDATA);
end
else if msgr=MP_NEXTWILLBEDATA then
begin
//要求发送端发送数据
Socket.SendText(MP_DATA);
end else if msgr=MP_END then
begin
memo1.Lines.Add ('文件传送完成!');
memo1.Lines.Add ('接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
fsRecv.Free;
end
//接收到文件传送取消信息
else if msgr=MP_ABORT then
begin
memo1.Lines.Add ('MP_ABORT');
Socket.SendText(MP_ABORT);
fsRecv.Free;
end
else
begin
if not tStart then
begin
memo1.Lines.Add('接收数据...');
tStart:=True;
end;
//将接收缓冲区数据写入文件
fsRecv.WriteBuffer(bufRecv^,iLength);
//通知客户端继续发送数据
Socket.SendText(MP_DATA);
end;
finally
//释放内存
FreeMem(bufRecv,iLength);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
//设置的监听端口
ss.Port:=2000;
//开始监听
ss.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ss.Close;
end;
end.
Delphi编写文件传输的实现方法?
的确是很大的命题,可用于文件网络传输的控件倒是不少,得到IP地址也不难,但最重要的问题是如何避开防火墙、路由的阻拦,也就是如何穿透路由/防火墙的技术。
建议先学习下以太网方面的知识。
================================================
通常情况下,我们都应该在应用层编程。就像阳光上的桥说的一样,实现文件传输并不困难。
对于获得对方IP的观念应该纠正一下。如果通信还没有建立,你又要主动发起和对方的通讯,那么你应该首先询问对方的地址;如果已经建立了通讯,那么对方的IP你已经就是知道了的。
打个比方:你要上我家来,你又从来没来过,你就需要问我我家在哪里,你是不可能凭空知道我家住何处的;你来过我家的话,不用我说你也知道我家在哪里,除非你忘了...
另外:非法穿透防火墙/路由会给客户的系统带来安全隐患,而且对于编程来讲也是不具备广泛性和持久性的。安全漏洞迟早是会被封锁的,除非你不考虑这些因素。
Delphi 文件传输
1.既然你要实现文件互传,那一般只能使用TCP方式(因为文件数据量一般比较大),那么在服务端使用TCP控件Listen,在客户端也使用TCP控件进行连接(connect),然后就可以了。如果你要实现双向传输,正如你所说,两边都要有服务端和客户端,即做一个软件,放两个TCP控件,一个用于服务端,一个用于客户端。-网络文件传输delphi
2.至于你后面一种情况,实际上这是一个你无法直接通过编程解决的问题(本质上是NAT,即1个外网IP=n个内网IP)。目前解决的方法是:
1)使用VPN,现成的是VNN软件(北京一个公司开发的,可以免费使用7天);
2)自己做个中转(中转软件运行一定要有外网地址),然后实现文件传输前,两个传输方都登录中转,所有传输通过中转软件就可以了。
目前我只知道这两种方法,如果有第三种,也请告诉我,谢谢!
Delphi中,怎么使用FTP主动下传文件
delphi 提供了 indy 组件包,其中 TIdFTP 可以实现通过以 FTP 方式进行文件的上传与下载。示例代码如下:procedure TForm1.Button2Click(Sender: TObject);var tt :TIdFTPListItems; t : TIdFTPListItem; i : integer; tfname : String;begin IdFTP1.TransferType := ftBinary; //指定为二进制文件 或文本文件ftASCII for i:=0 to IdFTP1.DirectoryListing.Count-1 do begin tt := IdFTP1.DirectoryListing; //得到当前目录下文件及目录列表 t := tt.Items[i]; //得到一个文件相关信息 Label1.Caption :=t.Text; //取出一个文件信息内容 tfname := t.FileName; showmessage(t.OwnerName+' '+t.GroupName+' '+t.FileName+' '+t.LinkedItemName); if IdFTP1.DirectoryListing.Items[i].ItemType = ditFile then //如果是文件 begin IdFTP1.Get(tfname,'d:\FTPtest\'+tfname,True,True); //下载到本地,并为覆盖,且支持断点续传 end; end;end;-网络文件传输delphi
DELPHI实现服务端与客户端之间进行文件夹传输
文件传输可以用FTP协议,delphi4,delphi7都有简易ftp的控件,另外,若服务器是公用服务器,也可以用标准下载方式。