怎样在Delphi 编程中实现web大文件上传?(200分)

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

xdenggao

Unregistered / Unconfirmed
GUEST, unregistred user!
做成ActiveX控件形式,要有进度条.http协议和FTP协议都可以考虑,
哪位大侠有这方面的研究或有源码可以给我参考一下吗?
如果分不够,还可以再送,多谢了
 
400分的贴。顶
 
电脑爱好者论坛 » 网站建设 » 编写Web方式上载文件的ASP组件

页: [1]


cyberia 2006-6-1 07:29

编写Web方式上载文件的ASP组件

编写Web方式上载文件的ASP组件

--------------------------------------------------------------------------------


黄明建
---- 基于Web方式上载文件,要遵从RFC1867标准。但IIS没有提供这方面的支持。虽然可以从Internet上下载这方面的ASP组件,但大多都是试用版,有使用时间的限制;并且,功能上也不能完全满足自己的要求。我们可以编写自己的ASP组件,使之适合自己的应用系统的需求。

---- 我们假设有如下的一个上载文件的.html文件,它被命名为demo.htm:



< htmL >
< BODY >
< FORM method=&quot;post&quot; enctype=
&quot;multipart/form-data&quot; action=&quot;upload.asp&quot; >
< input type=text name=&quot;text1&quot; >< BR >
< input type=file name=&quot;file1&quot; >< BR >
< input type=submit value=&quot;上载&quot; >
< /FORM >
< /BODY >
< /htmL >

---- 按照RFC1867标准,demo.htm传到服务器端的二进制数据具有类似的如下格式:



-----------------------------5fi25134734389
Content-Disposition: form-data; name=&quot;text1&quot;

Text test
-----------------------------5fi25134734389--
Content-Disposition: form-data;
name=&quot;file1&quot;; filename=&quot;E:/GIF/girl.gif&quot;
Content-Type: image/gif

GIF89a? ????噜鄛}}^^^υ,?
-----------------------------5fi25134734389

---- 其中, 类似于“-----------------------------5fi25134734389”的这一段字符串我们称之为“定界符”。我们看到,demo.htm文件中的Form元素“text1”,“file1”出现在定界符后的“name=”标记处;对text1而言,“name=”标记后紧接两对回车换行符(chr(13)&chr(10)&chr(13)&chr(10))即是客户端输入的值,该值结束时跟一对回车换行符和一个定界符;对file1而言,“name=”标记后的“filename=” 标记指出了客户端上载的文件的路径和文件名,下一行指出了文件的类型,后跟两对回车换行符表示文件数据的开始,文件数据结束时跟一对回车换行符和一个定界符。

---- 下面,我们以VB6.0中文版环境为例,讲述如何编写上载文件的ASP组件:

---- 1. 进入VB时,选择工程类型为ActiveX DLL。

---- 2.在工程窗口中选择工程,在属性窗口中给工程重命名,如“Huang”;在工程窗口中选择类模块“Class1”, 在属性窗口中将其重命名,如“UploadFile”,并且,将Instancing属性设置为“5-MultiUse”。

---- 3. 选择VB菜单“工程—— >引用—— >Microsoft Active Server Pages Object Library”,单击“确定”。

---- 4. 编写类模块,代码 Zip 2KB

---- 对存入文件的目标目录,要有写入的权限。

---- 对OnStartPage过程的说明:当客户请求一个基于ASP的Web文件时,Web 服务器会调用该ASP文件上所有ASP组件的OnStartPage方法。Web开发者可以在OnStartPage过程中访问ASP的内建组件。

---- 5.选择“文件—— >生成Huang.DLL”, 生成Huang.DLL。如果VB就在IIS服务器上,则VB会自动注册该组件;否则,把Huang.DLL拷贝到IIS服务器所在的Windows NT目录下,运行“Regsrv32 Huang.DLL”注册该组件。

---- 至此,文件上载的ASP组件编写并注册完成。

---- 编写upload.asp文件如下:



< %@ Language=VBScript % >
< htmL >
< BODY >
< %
Dim txtValue

Set obj = Server.CreateObject(&quot;Huang.UploadFile&quot;)
txtValue = obj.GetTheValue(&quot;text1&quot;)
Response.Write( &quot;text1的输入值是: &quot; & txtValue)
Response.Write &quot;< P > < /p >&quot;
Response.Write &quot;选择的文件已经上载到服务器!&quot;
obj.SaveTheFile &quot;file1&quot;, &quot;c:/test&quot;
% >
< /BODY >
< /htmL >

---- 上述例子在VB6.0中文版和IIS4.0中文版下调试通过


查看完整版本: 编写Web方式上载文件的ASP组件




Powered by Discuz! Archiver 4.1.0 &copy; 2001-2006 Comsenz Inc.
 
 

栏目→电脑→程序设计→ASP/ASP+→


 
编写功能完备的ASP文件上载组件
——对“编写Web方式上载文件的ASP组件”一文的补充
中国人民武装警察部队学院
马民
   黄明建的“编写Web方式上载文件的ASP组件”(以下简称原文)一文从RFC1867标准出发,分析了上传的二进制文件格式,编写出了具有文件上载功能的ASP组件,突破了多以Perl语言来实现WEB方式上载文件的方法。但原文忽略了以下几个关键问题:

按照RFC1867标准,上载的文件可以更换新名。在原文的demo.htm中,文本框text1即起到保存新文件名的作用。原文却忽略了这一点,使得text1成为一个并无实际意义的元素;

ActiveX代码部件(ASP组件)的接口函数(类的公有成员函数)是强类型检查,即必须指定形参的具体数据类型而不能使用自动类型(Variant);但在ASP环境中,所有的变量实际上都是Variant类型,如何使ASP的变量可以作为ASP组件接口函数的实参将关系到ASP组件是否具有实际的应用价值。原文也忽略了这一技术要点;

ASP组件毕竟是基于服务器端的,诸如空提交等的验证应首先在客户端采用VBScript/JavaScript来完成,以避免无用信息的传递。
   基于以上几点,本文首先升级了原文的ASP组件版本,使其成为一个功能完备的ASP文件上载组件。
   现将原文ASP组件中接口的规范说明总结如下:

   1、 功能:取得提交表单中元素的值;
   方法名:GetTheValue;
   形参:提交表单中元素名称,nm(数据类型:字符串);
   返回值:成功,则为指定的元素在提交表单中的值(数据类型:字符串);
    --- 失败,则返回零长度字符串。

   2、 功能:保存上载文件
   方法名:SaveTheFile
   形参:1、提交表单中文件类型元素名称,strTag(数据类型:字符串);
    - 2、保存目标文件的绝对路径,末尾不带“/”,strPath(数据类型:字符串);
   返回值:成功,则为保存的目标文件名(数据类型:字符串);
    --- 失败,则返回零长度字符串。

   本文升级的ASP组件与原文的ASP组件保持二进制兼容,即保留了原版本的全部接口,并增加了增强的接口,其规范说明如下:

   3、 功能:增强型保存上载文件,建议不再使用方法SaveTheFile
   方法名:ExSaveTheFile
   形参:1、提交表单中文件类型元素名称,strTag(数据类型:字符串);
    - 2、保存目标文件的绝对路径,末尾不带“/”,strPath(数据类型:字符串);
    - 3、保存的目标文件名(支持长文件名),strDesFileName(数据类型:字符串);
   此参数可选参数,未指定时,以源文件名作为目标文件名;
   返回值:成功,则为保存的目标文件名(数据类型:字符串);
    --- 失败,则返回零长度字符串。

   在ASP上载文件组件的新版本中,调用方法ExSaveTheFile如忽略可选取参数strDesFilename,则可以实现与方法SaveTheFile相同的功能;选取参数时,目标文件名既可以是用户指定的新文件名,也可以根据用户ID或cookie及数据库中的信息来生成,具有较强的实际应用价值。

   值得一提的是,在ActiveX DLL工程属性中应设置版本的二进制兼容并选择一个合适的基地址;另外,VB6提供一个打包和展开向导(Package & Deployment Wizard)用于将ActiveX部件打包成CAB文件并可部署到远程IIS服务器上。

   其次,解决ASP编程中调用ActiveX部件的参数类型匹配问题。由于ASP环境中变量都是Variant类型,直接以之作为ASP上载文件组件的实参就会产生类型不匹配的错误。根据笔者的经验和对ActiveX部件的反复测试,找到了以下解决方法:

   如果VarPara是ASP环境中的变量,则“” & VarPara可以匹配用VB编写的ActiveX部件中string数据类型。

   基于客户端的验证只是一个实现策略上的问题,可直接参考下面的例子(新ASP文件上载组件的全限定名改为UpLoad.UploadFile):

   示例文件upload.htm 和 示例文件upload.asp,可在此下载。

   以上例子在VB 6.0和IIS 4.0下测试通过。


示例文件upload.htm
<HTML>
<HEAD>
<META NAME=&quot;GENERATOR&quot; Content=&quot;Microsoft Visual Studio 6.0&quot;>
<TITLE>ASP文件上载组件示例</TITLE>
</HEAD>
<BODY>
<DIV align=center>
<script language=&quot;JavaScript&quot;>
function validate(TheForm)
{
var x=TheForm.file1.value;
if ( x.length < 1 ){
alert(&quot;请输入上载的文件!&quot;);
TheForm.file1.focus();
return false;}
else
return true;
}
</script>
</DIV>
<DIV align=center>
<FORM method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; action=&quot;upload.asp&quot; onsubmit=&quot;return validate(this)&quot;>
<DIV >ASP文件上载组件示例</DIV>
<P >保存到W3SVR的文件新名:
<INPUT id=text1 name=text1> (空则与源文件同名)<BR> 上载的文件:
<INPUT id=file1 name=file1 type=file><BR><INPUT id=submit1 name=submit1 type=submit value=上载> <INPUT id=reset1 name=reset1 type=reset value=重置></P>
   </FORM></DIV>
</BODY>
</HTML>



示例文件upload.asp

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME=&quot;GENERATOR&quot; Content=&quot;Microsoft Visual Studio 6.0&quot;>
</HEAD>
<BODY>
<%
   dim strPath,strDes
   Set UploadObj = Server.CreateObject(&quot;UpLoad.UploadFile&quot;)
  
   '指定目标文件路径
   strPath=&quot;d:/inetpub/wwwroot/project6/images&quot;
  
   strDes = UploadObj.GetTheValue(&quot;text1&quot;)
   Response.Write( &quot;指定的新文件名是: &quot; & strDes)
   Response.Write &quot;<p>选择的文件已经上载到服务器!&quot;
  
   if ( strDes = &quot;&quot; ) then
'未指定目标文件名,以源文件名作为目标文件名,等同方法SaveTheFile
UploadObj.ExSaveTheFile &quot;file1&quot;, &quot;&quot; & strPath
else
'以用户指定的新文件名作为目标文件名
UploadObj.ExSaveTheFile &quot;file1&quot;, &quot;&quot; & strPath, UploadObj.GetTheValue(&quot;text1&quot;)
'使用以下方法亦可
UploadObj.ExSaveTheFile &quot;file1&quot;, &quot;&quot; & strPath, &quot;&quot; & strDes
end if
%>
</BODY>
</HTML>
特别感谢『九头鸟』自发编辑『 dy 』| |


 
 
感谢大家对此问题的帮助,以上的源码我都有了,但问题的关键是要求显示进度条,能知道将要上传的文件大小,上传了多少,当前的传输速率等,当然能做到断点续传是最好不过了,所以要做成ActiveX形式.

请大家针对我的具体要求再帮帮我
 
看来没人回答了,希望你们继续支持
 
后退
顶部