ISAPI上传问题,请大家进来看看。(100分)

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

Unregistered / Unconfirmed
GUEST, unregistred user!
我用以下代码,怎么也返回不了上传的内容(我想把内容保存在一个BUFFER里):
procedure TWebModule1.WebModule1uploadAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
Pbuffer:pchar;
begin
getmem(pbuffer,request.ContentLength);
request.ReadClient(Pbuffer^,request.ContentLength);
response.Content:=pbuffer^;
freemem(pbuffer);
handled:=true;
end;

但我这样做却可以返回内容,不过好像有限制,超过50K就会丢数据
procedure TWebModule1.WebModule1uploadAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
response.Content:=request.content;
end;

请大家帮我看看,谢谢了!
 
d6中的demos/websnap/photogallery有一个文件上传的程序,好像是用的stream,你可以参考一下
 
我看了,并不能解决问呢,
 
没有人会吗???
 
分数不是问题,,,能者多得,,,
 
浏览器上传的内容太大的话,Request.Content将只包括一部分。
试试(未经测试):
procedure TWebModule1.WebModule1uploadAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
Pbuffer:pchar;
begin
getmem(pbuffer,request.ContentLength);

Move(PChar(Request.Content)^,pbuffer^,Length(Request.Content));

request.ReadClient((Pbuffer+Length(Request.Content))^,request.ContentLength-Length(Request.Content));
response.Content:=pbuffer^;
freemem(pbuffer);
handled:=true;
end;

还应判断Request.ContentLength是否为0,可能会出现该异常情况。
 
to kyq,
谢谢回答了。
“浏览器上传的内容太大的话,Request.Content将只包括一部分。”我在ASP里写过上传组件
为什么可以上传好几百M的文件都没问题,,但ISAPI却有问题呢?
 
在ASP组件中使用BinaryRead,TotalBytes也有该问题吧。
ASP其实是基于ISAPI的。
 
to kyq
ASP也有问题吗???我做那组件的时候,至少能上传100M的文件,但在ISAPI里却连50K也
读不了,再还没办法提交的数据回显。这又是什么问题呢??
 
网上有篇文章介绍过如何做上传的ISAPI,一时想不起来在什么地方了,你到计算机世界去找
找看。
另外最简单的方法就是用CGIEXCEPT控件,做文件上传就简单多了,它本身还带有例子。
 
to jobsxy,
能不能帮我找找,,我在google找过了都没有找到我想要的东西,,[:(][:(][:(]
 
计算机世界里的DELPHI小帖士太多了,不过今天居然打不开了,:(
 
[:(][:(][:(][:(]不会吧,,我的命真苦呀,,,[:(]
 
这个问题以前yysun也问过,包括版主在内的许多高手都没有给出最后的答案,估计比较
复杂,你要不就去下载CGIEXCEPT,或者研究它的源码。
 
[:(][:(]不会吧,,高高手也搞不定呀,,,[:(][:(][:(]
但我觉得肯定是行的,只是方法没有找到,,
 
试试一下以下代码,已试过能成功上传资料。
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
fs:TFileStream;

Size:Integer;

Buffer:Array [0..49152-1] of Byte;
begin
fs:=TFileStream.Create('c:/temp/data.txt',fmCreate);
try
fs.Write(
PChar(Request.Content)^,
Length(Request.Content)
);

while true do
begin
Size:=Request.ReadClient(Buffer[0],High(Buffer)+1);

if Size=-1 then
break;

fs.Write(
Buffer[0],
Size
);
end;


finally
FreeAndNil(fs);
end;

Handled:=true;
end;
 
to kyq
谢谢你的代码。

BTW:我问过别人,但他们给出来的方法和KYQ的方法可以说是一样的,都需要循环去读取数据
我不理解的是。为什么ISAPI里读取数据这么麻烦(循环读取数据),,而ASP里却非常容易呢?(一次成功)。
有谁能说清楚其中的问题所在吗?我可以出1K的积分。
 
使用循环去读取数据,其实是用小缓冲区处理大量数据,是必需的。

PS:请问在ASP中你是否用v=Request.BinaryRead(Request.TotalBytes)?
如果是,当上传100MB文件时,服务器应该狂读写硬盘,差不多Over了。
 
to kyq
这么晚还没有回去呀,谢谢你的回贴。[^][^]
按你这么说,是处理数据的机制不一样啦?
“如果是,当上传100MB文件时,服务器应该狂读写硬盘,差不多Over了。”
我的服务器没有OVER,只是在上传的时候内存消耗得很利害,但把数据存盘后,内存就下来了。
我想那是因为把数据都存在内存里的缘故了。说到这我又不明白了,其实无论循环还是一次
性读取数据,在我没有把这些数据处理、存盘前,那么它们都是存放在内存里了。即然即然最后的
结果是一样那么为什么你说“使用循环去读取数据,其实是用小缓冲区处理大量数据,是必需的。
”呢?,请指教了。
 
再,我发觉几朋友提供的代码都是一次读取数据是不超过48K的,也就是上传数据超过48K的的时候就要循环读取了。
这个48K是ISAPI本身规定的吗?
 
后退
顶部