asp上传组件:用Delphi 6开发ASP上传组件详解来源: 发布时间:星期五, 2008年12月26日 浏览:121次 评论:0
左轻侯
文件上传是WEB开发中经常要用到功能但ASP本身和内置组件都不支持文件上传功能网上流 传些第 3方组件虽然能够解决这个问题但大多是要收费更别说Open Source了本文将详细 剖析WEB文件上传原理以及步步指导读者如何用Delphi6开发个ASP上传组件 源码和demo我已经发布在个人主页上 http://www.wushuang.net 1 Html文件分析 首先我们来看个html文件源码文件名是test.htm功能是提供用户上传界面: <html> <body> <center> <form name="Form" enctype="multipart/form-data" action="test.asp" method=post> <input type=file name=mefile><br> <input type=hidden name=a1 value="fdsaf"> <input type=hidden name=a2 value="fdsaf"> <input type=hidden name=a3 value="fdsaf"> <input type=hidden name=a4 value="fsdfsdsaf"> <input type=hidden name=a5 value="这个是这个"> <input type=text name=a6 value="fdsaf"> <input type=submit name=ok value="OK"> </form> </center> </body> </html> 这个文件里包含了个名为Formform以及随手写些input域注意这个form和 般form有两个区别地方:是它有个type=file域没有value用浏览器打开这个文件时 这个域会表现为个右侧有“浏览”字样文件输入框用户可以通过它来选择本地硬盘上文件 2是 form有个特殊属性:enctype="multipart/form-data"这个属性告诉浏览器要上传 2进制文 件并进行相应编码 这种编码会产生什么样表单信息呢?让我们来看看test.asp也就是接受表单asp文件源码 它非常简单: <% formsize=request.totals '获得表单原始信息长度 formdata=request.binaryread(formsize) '读取表单原始信息 response.binarywrite formdata '返回表单原始信息 %> 如读者在注释中了解这段代码功能是将表单原始信息返回让我们来看看它运行效果将 这两个文件置于web目录下访问test.htm在文件输入框中选择个文件(我选了个jpg图片 不过最大不要太大)提交然后可以看到这样堆乱 7 8糟信息: -----------------------------7d2227629012e Content-Disposition: form-data; name="mefile"; filename="C:\Documents and Settings\aaa\My Documents\My Pictures\zzjh.jpg" Content-Type: image/pjpeg (作者注:以下为乱码) -----------------------------7d2227629012e Content-Disposition: form-data; name="a1" fdsaf -----------------------------7d2227629012e Content-Disposition: form-data; name="a2" fdsaf -----------------------------7d2227629012e Content-Disposition: form-data; name="a3" fdsaf -----------------------------7d2227629012e Content-Disposition: form-data; name="a4" fsdfsdsaf -----------------------------7d2227629012e Content-Disposition: form-data; name="a5" 这个是这个 -----------------------------7d2227629012e Content-Disposition: form-data; name="a6" fdsaf -----------------------------7d2227629012e Content-Disposition: form-data; name="ok" OK -----------------------------7d2227629012e-- 这就是用"multipart/form-data"方式编码表单原始信息其中那段看起来是乱码部分就 是jpg图片编码 分析下这段信息格式: -----------------------------7d2227629012e 这是各个域的间分隔符 Content-Disposition: form-data; 介绍说明这是表单中域 name="mefile"; 域名称 filename="C:\Documents and Settings\aaa\My Documents\My Pictures\zzjh.jpg" 上 传文件在本地硬盘上名称 Content-Type: image/pjpeg 文件类型 后面是文件本身数据 其它各个域信息也可以以此类推 众所周知在ASP中使用request对象可以访问用户提交表单各个域request对象 会对原始表单信息进行解析提取出表单中每个域值但是request并不能解析这 "multipart/form-data"格式表单信息这就是ASP不能直接支持文件上传原因所在读者可以 试试在test.asp中用request("mefile")这样格式是不能读取到正确信息 问题症结已经找到解决思路也很简单:用Delphi开发个COM组件接受这种原始表单信息 将各个域提取出来返回给asp文件也就是完成request对象没有完成功能 2 用Delphi开发组件 Delphi6对开发ASP组件提供了极好支持大大简化了我们开发过程 启动Delphi 6选择File-New-Other-ActiveX-ActiveX Library这样就建立了个 ActiveX库将此Library改名为myobj存盘选择File-New-Other-ActiveX-Active Server Object在CoClassname中填入upfile确定这时会跳出个标题为myobj.tlb对话框这是 Delphi特有以可视化方式编辑COM接口功能用Delphi开发过COM读者应该比较熟悉 在myobj下名为IupfileInterface下添加5个属性和个思路方法如果不懂得如何操作 请参见Delphi参考书相关部分按F12可以看到生成相应myobj_tlb.pas文件其中 Iupfile接口应该是这个样子: Iupfile = erface(IDispatch) ['{5C40D0EB-5A22-4A1E-8808-62207AE04B51}'] procedure _disibledevent= nothing %> 再次访问test.htm提交表单现在你可以看到相关返回信息并且在服务器上test.asp所处 目录下找到上传文件 这个组件只能上传单个文件但根据同样原理次上传多个文件功能也是不难实现有兴趣 读者可以自行尝试 0
相关文章读者评论发表评论 |