s : LongInt;
ContentData : AnsiString;//请求信息内容的字符串表示
strTemp : string;
FindEndOfFileData : boolean;//是否找到文件数据结束位置
begin
//提取客户端上传的请求信息数据
FScriptingContext := AScriptingContext as IScriptingContext;//获取ASP上下文信息
ARequest := FScriptingContext.Request;//获取WWW请求信息
FContentLength := ARequest.TotalBytes;//请求信息内容长度
//创建动态数组,用于以数组形式存储请求信息内容
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//将请求信息内容存储到数组中
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead( AOleVariant );//读取请求信息内容
//将请求信息内容转化为字符串,便于定位
ContentData := '''';
for longIndex := 0 to FContentLength - 1 do
begin
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
if FContentData[ longIndex ] = 0 then break;//0表示内容结束
end;
3、获取分界符、上载文件名称
//获取表单域的分界符
longPos := pos( #13#10,ContentData );//回车换行符所在位置
FDelimeter := Copy( ContentData,1,longPos-1);//该位置之前的内容为分隔符
//获取带源路径的文件名称,在请求信息内容中,文件名称以
//filename="path/filename"的形式存储
strTemp := ''filename="'';//文件名称在“filename="”之后
longPos := pos( strTemp, ContentData );//获取“filename="”位置
if longPos <= 0 then
begin
FFileName := '''';
FFileDataStart := -1;
FFileDataEnd := -2;
exit;
end;
//获取下个双引号“"”之前的内容,即带源路径的文件名称
longPos := longPos + length( strTemp );
strTemp := '''';
for longIndex := longPos to FContentLength - 1 do
if ContentData[ longIndex ] <> ''"'' then
strTemp := strTemp + ContentData[ longIndex ]
else break;
FFileName := strTemp;
4、获取文件数据的在请求信息内容中的开始、结束位置
//文件数据开始位置在文件名称后的第一个#13#10#13#10之后
delete( ContentData, 1, longIndex );
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;
//文件数据结束位置在下一个#13#10和分界符之前
//由于文件数据可能包含非法字符,不能再用字符串定位函数POS
//查找下一个分界符的位置
FFileDataEnd := FFileDataStart;
intDelimterLength := length( FDelimeter );
FindEndOfFileData := false;
while FFileDataEnd <= FContentLength - intDelimterLength do
begin
FindEndOfFileData := true;
for ALongInt := 0 to intDelimterLength - 1 do
if Byte( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[ FFileDataEnd + ALongInt ] then
begin
FindEndOfFileData := false;
break;
end;
if FindEndOfFileData then break;
FFileDataEnd := FFileDataEnd + 1;
end;
if not FindEndOfFileData then FFileDataEnd := FFileDataStart - 1//未找到分界符
else FFileDataEnd := FFileDataEnd - 3;//分界符,向前跳过#13#10
end;
(三)向ASP
程序传递信息
在进行了(二)的操作之后,我们的上载组件可以根据ASP
程序的要求向其传递数据了。目前可以提供的数据有:客户端源文件名称(FFileName,含路径)、文件大小(FFileDataEnd-FFileDataStart+1)。
首先应该在TLB设计窗口中声明如下两个方法GetFileName和GetFileSize。
1、返回客户端源文件名称(含路径)
//返回客户端源文件名称(含路径)
function TUploadFile.GetFileName: OleVariant;
begin
result := FFileName;//客户端