| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
Delphi 6开发ASP上传组件详解
作者:佚名    文章来源:网络    点击数:    更新时间:2006-12-2
 

 

由于Delphi已经对ASP中的对象进行了很好的封装,所以即使在Delphi环境下,也可以方便地调用它,就象在ASP中一样,例如Request.TotalBytes。首先将原始表单数据读入到一个OleViarians类型的pvar中,然后通过一个循环,将它转换为Delphi中的string格式,并存放在FContentData中。

接下来,通过查找换行符,解析出分隔符的内容和长度。然后在一个循环中,用AnalyFormData成员函数一一解析出每个域。初始化工作就这样完成了。

再看AnalyFormData函数的实现:

procedure Tupfile.AnalyFormData(content: string);
var
  pos1,pos2:integer;
  FormName,FormValue:string;
  isFile:boolean;
begin
  isFile := false;
  pos1 := instr('name="',content,1)+6;
  pos2 := instr('"',content,pos1);
  FormName := copy(content,pos1,pos2-pos1);

  //检查是否文件
  pos1 := instr('filename="',content,pos2+1);
  if pos1 <> 0 then
  begin
    isFile := true;
    pos1 := pos1 + 10;
    pos2 := instr('"',content,pos1);
    FFilename := copy(content,pos1,pos2-pos1);
  end;

  pos1 := instr(#13#10#13#10,content,pos2+1)+4;
  FormValue := copy(content,pos1,length(content)-pos1);

  if isfile then
  begin
    FFileData := FormValue;
    //查找文件类型信息
    pos2 := instr('Content-Type: ',content,pos2+1);
    if pos2 <> 0 then
    begin
      pos2 := pos2 + 14;
      FFileType := copy(content,pos2,pos1-4-pos2);
    end;
  end
  else
  begin
  FFormInfo.add(FormName+'='+FormValue);
  end;
end;

如注释中所表达的,AnalyFormData提取原始数据中的域。如果是域是文件类型,则将文件类型和文件数据分别放入FFileType和FFileData中。如果是其它类型,则将名称和值放入一个TStringlist类型的FFormInfo中。FFormInfo中维护着除文件类型外的所有域的信息,以“名称=值”的格式存放。

  
function Tupfile.Get_Form(Formname: OleVariant): OleVariant;
begin
    Result := FFormInfo.Values[Formname];
end;

这个函数返回域的值。只需要简单地调用FFormInfo的values方法,就可以得到相应的值。这是在Tstringlist类内部实现的。

function Tupfile.Get_FileName: OleVariant;
begin
  Result := ExtractFileName(FFileName);
end;


function Tupfile.Get_FileSize: Integer;
begin
  Result := length(FFileData);
end;

function Tupfile.Get_FileData: OleVariant;
var
  i:integer;
begin
  Result := VarArrayCreate( [0,length(FFileData)], varByte );
  for i := 0 to length(FFileData)-1 do
  begin
    Result[i] := Byte(FFileData[i+1]);
  end;
end;

这三个函数分别返回文件的名称、大小、数据。要注意的是,在返回文件数据时,必须进行相应的转换,将Delphi中的string类型转换为OleVariant类型。

  
procedure Tupfile.FileSaveAs(Filename: OleVariant);
var
  fsout:TFileStream;
  i:integer;
  afile:file of byte;
begin
  fsout := TFileStream.Create(Filename,fmcreate);
  for i := 1 to length(FFileData) do
  begin
    fsout.Write(Byte(FFileData[i]),1)
  end;
  fsout.Free;
end;

这个方法将文件保存到服务器上的磁盘。

编译myobj这个project,得到一个myobj.dll文件。开发工作就此完成。

3 使用ASP上传组件

在命令行下,输入“regsvr32 myobj.dll”。弹出一个对话框,告诉你组件已经注册。如果找不到regsvr32.exe这个文件,它在windows\system32或winnt\system32目录下。

将本文开头提到的test.asp文件修改为如下内容:

<%'建立对象 
Set upfile = Server.CreateObject("myobj.upfile")

'获得表单对象
response.write upfile.form("a1")&"<br>"
response.write upfile.form("a2")&"<br>"
response.write upfile.form("a3")&"<br>"
response.write upfile.form("a4")&"<br>"
response.write upfile.form("a5")&"<br>"
response.write upfile.form("a6")&"<br>"

'获得文件大小
response.write "文件字节数:"&upfile.filesize&"<br>"
'获得文件类型
response.write "文件类型:"&upfile.filetype&"<br>"

'获得文件名,保存文件
upfile.filesaveas(Server.MapPath("")+upfile.filename)

set upfile = nothing
%>

再次访问test.htm,提交表单。现在你可以看到相关的返回信息,并且在服务器上test.asp所处

的目录下找到上传的文件。

这个组件只能上传单个文件,但根据同样的原理,一次上传多个文件的功能也是不难实现的。有兴趣的读者可以自行尝试。

上一页  [1] [2] 


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章