我想做个asp 的Upload(30分)

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

onedolph

Unregistered / Unconfirmed
GUEST, unregistred user!
上回cAKK给我发的一个Upload,不知什么原因,我把.zip解不开.
所以我想算了,我自己做一个吧,用delphi.
参考了一下CGIExpert里的例子,"发现"其原理:
在Form那一行加 Enctype="Multipart/form-data",就会在post的时候,
把文件一起送到服务器,存为一个临时文件,
然后,在服务器端把该文件改个名就可以了.
可是,在cgiexpert里,可以用FormVar("","")取得到那些input的值,
而我在asp里用Request.Form("")就什么也得不到,
如果不用Enctype="Multipart/form-data"的话,就可以了.
如果我能既用Enctype,又要能象用Request.Form("")一样取得到值,
可能就解决问题了.
各位有何高见?
考虑到可能没有结果,先给30分,如果解决了,一定送上100分.
 
我再给你发一次吧!注意查收.
 
cAKK,看了我上面的想法了吗,发表一下高见吧?
就是说,在用了Enctype="Multipart/form-data"后,怎么才能正确得到
Request.Form("")的值?
 
到www.chinaasp.com中找找吧, 太多回答了.
 
确信是用的POST方法提交的?
 
对了,好像用了Multipart/form-data之后是不能得到form的值,
你需要把数据全部度出来,然后自己分析.

我发给你的文件包里有一片htm文章讲到这个的,你自己看看把.
 
如果你从CGI的原理来看,他收到的数据是一份TXT的文件
使用一些分隔符号隔开,如果你能收到这种原始的文件,
就对你自己编写分拆出上载文件的内容有很大的帮助。
如何DECODE这样的文档,网上有很多程序公开,也可以找个
好的自己移植到DELPHI上。
 
cAkk,你最后发给我的那个.zip我终于打开了,
看了一下里面的.doc,现在就差一个关键的地方了.
正如堕落·阿修罗所说,如何decode收到的文档是个问题.
你发给我的那个例子,是用vb做的,它是用strconv(" ",vbUnicode)
就可以decode这个文档,我想问大家,delph里有没有类似的函数?
我努力了一下,没有找到.

堕落·阿修罗,能不能介绍一个站点,我去看看.
 
介绍一个办法:看看CGI Expert的源代码. :-)

我是懒的看了.
 
cgi expert 的原代码我看了,它就是用它的FormVar(''),
而且它的方法是用RenameFile,就是我问题中说的,
根本不是从接收到的数据里面把文件分离出来.
 
onedolph: 这说明你还没有看透源码. CGI Expert的FormVar函数并不是
一个现成的函数,你应该看看FormVar是怎么实现的.
至于RenameFile,那是因为CGI exp的实现方式是先把文件拉
下来,保存成临时文件,然后再做处理,所以你首先应该看看它
是怎么把文件拉下来的...多用几个ctrl+click,深入源码看看吧!

如果今天有时间,我帮你看看.其实我也一直很想搞明白这个问题,只是懒.
 
下面是CGI Expert读取二进制内容的代码
function THttpEngine.ReadBinary(var Buffer; Length : longInt):Integer;
var
BytesRead : Integer;
begin
if InStream=Nil then
begin
result:=-1;
exit;
end;

{$IFNDEF CONSOLE_MODE}Application.processMessages;{$ENDIF}
BytesRead:=0;
result:=0;
if WatchDogThread<>nil then
WatchDogThread.Timer := Now+(INPUT_WATCHDOG_TIMER/86400);
while (result<Length) and (BytesRead>=0) do
begin
{$IFNDEF CONSOLE_MODE}Application.processMessages;{$ENDIF}
if Length-Result>1032 then
BytesRead:=InStream.read(PChar(@Buffer)[result],1032)
else
BytesRead:=InStream.read(PChar(@Buffer)[Result],Length-Result);
if BytesRead>0 then
begin
if WatchDogThread<>nil then
WatchDogThread.Timer := Now+(INPUT_WATCHDOG_TIMER/86400);
result:=result+BytesRead
end
else if result=0 then
begin
Sleep(10); //Avoid busy wait
result:=BytesRead;
end;
end;
if WatchDogThread<>nil then
WatchDogThread.Timer := 0;
if (DebugMode>NoDebug) and (result>0) then
DebugInput.Write(PChar(@Buffer)[0],result);

end;

下面是它针对MULTIPART/FORM-DATA的解码函数
procedure DecodeVarList(VarList : TStringList; Vars : PChar);
var
StartVar,EndVar, Equal,OldLocation : Integer;
Name,Value,OldValue : String;
begin
//Add each variable from the string "Variables" to the string list "FormVariables"
StartVar:=0;Equal:=0;
for EndVar:=0 to StrLen(Vars)-1 do
begin
if Vars[Endvar]='=' then
begin
Vars[Endvar]:=#0;
Equal:=EndVar
end
else if Vars[Endvar]='&' then
begin
Vars[EndVar]:=#0;
if Equal>StartVar then
begin
Name:=StrPas(PChar(Vars+StartVar));
Value:=UrlDecode(StrPas(PChar(Vars+Equal+1)));
OldValue:=VarList.Values[Name];
OldLocation:=VarList.IndexOf(Name+'='+OldValue);
if (OldLocation>=0) then
begin
VarList.Delete(OldLocation);
Value:=OldValue +#13#10+Value;
end;
VarList.Add(Name+ '=' + Value);
end;
StartVar:=EndVar+1;
end;
end;
end;

能看懂了吗?
 
呵呵, vb的strconv(" ", vbunicode)只是把收到的字符串转成unicode码, 换句
话说就是widestring, 现在明白了吧:-) 只要用widestring(' ')就可以实现delphi
转换:-)
关于decodevarlist, 其实很简单的, 就是把&连接的字符串分割成一个stringlist,
即a=1&b=2分割成
a=1
b=2
的stringlist, 其中要解决的主要问题是UrlDecode这个函数的使用, 具体还是看
原码吧. 我原来使用vb来写cgi的, 有自己写的urldecode和urlencode函数, 实现
其实比较简单.
 
我曾经看到过一个用delphi为asp开发文件上载组件的例子,其是调用request中的方法binaryread将客护端上传的请求信息数据读取到一个byte数组中,然后按rfc1876标准定义的数据格式来分析和提取数据,但若再使用request.form读取数据,将发生错误!
 
近来忙一个项目,不如以前了,很少能上网.
cytown,widestring('')就能转换?不行吧,我没成功.
(另外,我先把头捂住,别打我,我还在用D3!).
 
呵呵, d3对unicode支持不好:-(
改用d4吧:-)
 
cytown,
你是说,把那数据读到一个变量,比如a : olevariant,或 a: string.
然后,a:=widestring(a),就行了,对吗,
如果不是,虚心求教,
可能与delphi的版本无关吧,我装了d4,好想也不行.
还是我的方法不对,请教.
具体怎么实现,能不能给个例子.

cakk,
你给出的ReadBinary函数,里面没有它解码的算法吧,没看懂,请教.
 
如果CGI Expert里面没有你所要的"解码",那么肯定就不需要"解码",因为
CGI Expert的结果是正确的.
 
我已经用了chinaasp里的那个控件,这个问题到此为止,
以后有时间慢慢研究。
 
后退
顶部