急死人的问题(100分)

  • 主题发起人 主题发起人 fmz
  • 开始时间 开始时间
F

fmz

Unregistered / Unconfirmed
GUEST, unregistred user!
在只知道服务器端的一个虚拟路径情况下,怎么从过客户程序把文件传到那个虚拟路径下,
如虚拟路径是http://192.168.0.1/book,客户端有一个文件XXX,要做就是把XXX复制到http://192.168.0.1/book,各位大哥哥帮帮小弟了,真的是急死人了
 
不会吧,真没有人知道呀,刚才我看了一下说ICS控件可以做,不知道那里有下的
 
ICS在什么地方有下载呀
 
不知有没有权限呢
 
TO bh812:
就说在有写这种权下载怎么实现吧
 
NMHTTP 好像也可以,那位有源码
 
要是客户端如此随便地读写服务器,那不是太可怕了吗?
 
to loxtln :
不管那么多了,能不能想个可行的方案出来,急死人了
 
也就是说,你可以有权限在服务器端作任何设置啦,如果是这样那就好办了。
有太多种方案可供选择。如果一定要从80口(HTTP协议的默认口)走的话,你在服务器端写
一个负责接收并写盘的CGI,客户端用IDHTTP或者NMHTTP把文件POST过来不就行了。其实说到底,就是用HTTP协议来传输文件的问题。我就作过这样的应用,是因为我们是通过代理上网的(且只代理了80口),而我们的一些用户又要频繁地向我们传输文件,所以才这样做。
 
to loxtln:
劳驾大哥可否把你写过的代码帖出来看看,我真是急死了,急得我都不知道干什么了
 
服务器端cgi:
procedure TWebModule1.WebModule1WebActionItem4Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
TotalBytes : DWORD;
AvailableBytes : DWORD;
ExtraBytes : DWORD;
ActualBytesRead : DWORD;
ExtraBytesRead : Integer;
pBuffer : PChar;
extBuffer : PChar;
Strm : TMemoryStream;
ch:string;
begin
try
// 获取要保存的文件名(包括路径,当然这里也可根据你的需要灵活,比如为了不让客户端随便往任意目录写东西,可作一些控制,如只能写到某一个固定目录下)
ch:=request.QueryFields.Values['filename'];
TotalBytes := Request.ContentLength;
GetMem(pBuffer, TotalBytes);
pBuffer^ := Chr(0);
Strm := TMemoryStream.Create;
try
AvailableBytes := Length(Request.Content);
{ Put the contents of Request.Content into pBuffer }
pBuffer := PChar(Request.Content);
Strm.Write(pBuffer^,AvailableBytes);
{ Check to see if HTTP Content > Request.Content }
if TotalBytes > AvailableBytes then
begin
ExtraBytes := TotalBytes - AvailableBytes;
GetMem(extBuffer, ExtraBytes);
extBuffer^ := Chr(0);
ExtraBytesRead := 0;
repeat
ActualBytesRead := Request.ReadClient(extBuffer^,ExtraBytes - ExtraBytesRead);
Strm.Write(extBuffer^,ActualBytesRead);
Inc(ExtraBytesRead, ActualBytesRead);
until ExtraBytes - ExtraBytesRead = 0;
end; { Larger Than 48K }
{ Remove the Header and footer and save the file }
{ RemoveHTTPHeaders(Strm);
Response.Content := pageproducer1.Content ;}
strm.SaveToFile(ch);
Response.Content :=formatdatetime('yy-mm-dd hh:nn',now)+'传送成功';

finally
Strm.Free;
end;
except
on E : Exception do
Response.Content := formatdatetime('yy-mm-dd hh:nn',now) + E.Message;
end;
end;

客户端:用nmhttp发送任意文件(如将客户端c:/1.gif 传送到服务器端d:/Book/my1.gif):
上面CGI程序对应的pathinfo为upload:

nmhttp1.OutputFileMode:=true;
nmhttp1.Post('http://xx.xx.xx.xx/cgi-bin/Mycgi.exe/upload?Filename=d:/Book/MY1.gif','c:/1.gif')

 
to loxtln:
没有成功,有时提示"range check error",有时也不提示,但也找不到考过去的文件

nmhttp1.Post('http://192.168.0.11/tsg/projectb.exe/upload?Filename=C:/Program Files/Library4.0/Server/Html/fff.txt','c:/aa.txt');这是我在客户端写的,成功后应该在C:/Program Files/Library4.0/Server/Html/ 这个目录下找到FFF.TXT但没有,

我看了一下NMHTTP的帮助,它说用
nmhttp1.OutputFileMode:=true;
NMHTTP1.Put(url,filename);
nmhttp1.OutputFileMode:=FALSE;
就可以上传文件,我也没有成功,哎,怎么办
 
没有道理不成功的,我刚刚有试了一把,完全没有问题,你是的出错信息是在客户端还是服务器端?
请检查:①相应读写文件的CGI的PATHINFO是否为UPLOAD
②TSG目录是否具有执行CGI的权限
③服务器端C:/Program Files/Library4.0/Server/Html/这个目录是否存在?
如果都没有问题,我就不知道了.
 
IntraWeb 用过吗?用它来实现文件上传就更简单啦,给个MAIL,给你个例子.
 
unit IWUnit1;
{PUBDIST}

interface

uses
IWAppForm, IWApplication, IWTypes, IWCompEdit, Classes, Controls,
IWControl, IWCompLabel, IWCompButton;

type
TformMain = class(TIWAppForm)
IWLabel1: TIWLabel;
IWFile1: TIWFile;
IWEdit1: TIWEdit;
IWLabel2: TIWLabel;
IWButton1: TIWButton;
procedure IWButton1Click(Sender: TObject);
public
end;

implementation
{$R *.dfm}

uses
ServerController;

procedure TformMain.IWButton1Click(Sender: TObject);
begin
try
IWFile1.SaveToFile(iwedit1.Text );
Webapplication.ShowMessage('传输成功!');
except
Webapplication.ShowMessage('传输失败!');
end;


end;

end.
 
多人接受答案了。
 
后退
顶部