数据读取中...
 您当前位置:惠州维修 -> 网络-> asp技术交流 文章搜索:  
ASP无组件上传·从原理剖析到实践四
作者:转载 来源:惠州维修
日期: 2004-10-6
放大字体显示 缩小字体显示 打印文章 推荐给朋友
’ 截取剩下的部分,递归调用这个函数,来得到下一个part1。 
   Call fillEveryFirstPart(rightb(data, lenb(data)-endpos-1)) 
 End Sub  

 ’ 这是一个公用函数,作用是二进制和字符串的转换 
 Private Function B2S(bstr) 
   If not IsNull(bstr) Then 
     for i = 0 to lenb(bstr) - 1 
       bchr = midb(bstr,i+1,1) 
       If ascb(bchr) > 127 Then ’遇到了双字节,就得两个字符一起处理 
         temp = temp & chr(ascw(midb(bstr, i+2, 1) & bchr)) 
         i = i+1 
       Else 
         temp = temp & chr(ascb(bchr)) 
       End If 
     next 
   End If 
   B2S = temp 
 End Function 

End Class 

’ 这是一个辅助类,为了实现outRequest.Forms.Count功能。 
Class Counter 
 Private m_iCnt 

   ’ count是咱们这个类的一个只读属性 
 Public Property Get Count() 
   Count = m_iCnt 
 End Property 

 Public Function setCount(cnt) 
   m_iCnt = cnt 
 End Function 
End Class 
%> 

<% 
’下面是测试码 
set outRequest = new UploadRequest 
%> 

<%=outRequest.Form(0).Name%>:<%=outRequest.Form("file1_desc")%><br> 
<%=outRequest.Form(1).Name%>:<%=outRequest.Form("file2_desc")%><br> 
<%=outRequest.Form(2).Name%>:<%=outRequest.Form(2).Count%><br> 
<%=outRequest.Form(3).Name%>:<%=outRequest.Form(3)%> 

一共有<%=outRequest.Forms.Count%>个文本单元<hr> 

<%=outRequest.File(0).Name%>: 
<%=outRequest.File("file1").ContentType%>: 
<%=outRequest.File("file1").Size%>byte: 
<%=outRequest.File("file1").FileName%>: 
<%=outRequest.File("file1").FilePath%><br> 

<%=outRequest.File(1).Name%>: 
<%=outRequest.File("file2").ContentType%>: 
<%=outRequest.File("file2").Size%>byte: 
<%=outRequest.File("file2").FileName%>: 
<%=outRequest.File("file2").FilePath%><br> 

一共有<%=outRequest.Files.Count%>个文件单元<hr> 

<% 
’如果要测试文件1内容,可以: 
’response.clear 
’response.contenttype = outRequest.File("file1").ContentType 
’response.BinaryWrite(outRequest.File("file1").Data) 
’如果要测试文件2内容,可以: 
’response.clear 
’response.contenttype = outRequest.File("file2").ContentType 
’response.BinaryWrite(outRequest.File("file2").Data) 
%> 

测试表单testform.html还用第三天那个。注意,每一个文本表单域和文件表单域都要填上,原因还是测试码给得很特殊,读了各个项目的值,测试了各个属性。不过,现实情况下,因为事先知道表单域的名称;即使不知道,也可以用outRequest.Forms.Count/outRequest.Files.Count来循环读取,所以是没问题的,不容易出错。 

试试看!怎么样?成功!注意测试码最下边的部分,用来测文件内容的。分了两段,可以分别打开注释,进行测试哦。 
现在,中英文文本都没有问题;文件也是各种都行,路径没限制。用法也很简单,很清晰。现在,文本域、文件域的读取就都解决了! 

-------------------------------------------------------- 
今天这一段是很有意思的。结合第三天的内容,就可以看到解决upload问题的全貌了。这两次我都是越写越兴奋,放不下。不过,这可还没有结束哦!要做一个功能强大的东东出来,还需要限制上传文件尺寸、限制类型、存盘、入库等附加功能。所以,打起精神,让我们一鼓作气,把他彻底搞定!哦?!现在都一点啦,明天吧,呵呵。。。 

============================================================== 
第六天:附加功能 

现在,核心功能已经实现了。但是,仅仅这样,还不能大幅度的提高我们的工作效率。一些常用的、重复的操作,象限制上传文件大小、类型以及文件存盘、入库等还是应该统一处理。所以,当前的目标,就是封装常用的功能,尽量让他好用。 

首先,我们看看上传限制的实现。我们要控制的,有文件大小,和文件类型。大小很容易控制,只要在每次读取文件放进FileElement类的时候(执行Add方法的时候),看一下它的Size,并且适时的抛出异常就可以了;文件类型控制类似,不过需要判断一下扩展名(当然也可以利用contentType,不过更依赖机器配置——每一种机器可以识别的contentType各有不同)。 

然后,就是结果的永久性保存了。为了灵活起见,入库就不再封装,由用户解决;存盘因为它是原子操作(本身不可分割,而且也不依赖其他操作),可以比较好的封装。我们可以在UploadRequest类提供SaveTo(serverpath)方法,用来一次性保存所有图片;另外在FileElement类里提供SaveTo(serverpath)和SaveAs(serverpath, newfilename)方法,分别实现按照原文件名保存图片以及按照指定文件名保存文件的功能。 

考虑到上传控制的问题,把读取数据的fill方法放到Class_Initialize已经不合适了。我们另做一个Upload方法,进行文件上传的具体操作。这样,就可以在上传之前,对ourRequest进行设置。新的类设计如下: 
A。UploadRequest(上面设计过,这里是扩充) 
这个类和request对象是对应的 
属性: 
 RawData      得到原始数据,方便检查[只读] 
 Forms        得到一个有count属性的计数器, 
              可以用outRequest.Forms.Count的方式,得到文本表单域的的个数[只读] 
 Files        得到一个有count属性的计数器, 
              可以用outRequest.Files.Count的方式,得到文件表单域的的个数[只读] 
 Form(index)  可以用数字或文本检索文本表单域,做用类似request.form。 
              他返回一个FormElement型的对象[只读] 
 File(index)  可以用数字或文本检索文件表单域,他返回一个FileElement型的对象[只读] 
 TotalBytes   得到所有文件总大小[只读] 
 AllowedFilesList   设置允许上传的扩展名[只写] 
 DeniedFilesList    设置不允许上传的扩展名(和AllowedFilesList任取一个就行了)[只写] 
 MaxFileSize        设置允许上传的每个文件的大小[只写] 
 TotalMaxFileSize   设置允许上传的所有文件的大小[只写] 
方法: 
 Upload       上传分拆的具体实现方法 
 SaveTo(path) 保存所有的文件到指定路径(按原名) 

B。FileElement 
可以把它看成单个文件域的化身。通过这个类,可以得到详细的文件信息,比如name,data,path,filename,contentType,size等等。 
属性: 
 Name         文件域的名称。就是<input type=file name=xxx>里的xxx[只读] 
 Data         文件域的内容。二进制串[只读] 
 ContentType  文件域的contentType[只读] 
 FilePath     文件域包含的文件在客户机上的全路径[只读] 
 FileName     文件域包含的文件的文件名[只读] 
 Size         文件域包含的文件的尺寸[只读] 
方法: 
 SaveTo(path) 保存当前文件到指定路径(按原名) 
 SaveAs(path, name) 按给定文件名保存当前文件到指定路径,如果存在,就覆盖 
 SaveWithoutOverwrite(path, name)    按给定文件名保存当前文件到指定路径,不覆盖 

保存文件的时候,因为它是二进制流,所以,只能用于文本操作的fso是不能用的,这里,我们用到了ado的stream对象,他也是唯一的选择。但是,一定要注意,因为新版ado才有他,所以,老的系统可能不能正确的进行文件的保存。如果提示了stream对象的问题,请升级MDAC,或者干脆放弃这个功能。因为我们之所以用无组件的方法,就是不想在server上配置。装MDAC本身已经偏离了目标。 

现在,只要实现了这几个新方法和属性,我们的无组件上传就可以说是大功告成了。明天,我们就最终实现这个功能完善的类,并且把前两天没有注意到的细节进行一些修补。其实明天的内容不多,新的知识只有stream对象的用法。这些,在论坛里以前就有提及,如果不是很清楚,可以翻看一下论坛的旧贴,或是到http://www.2yup.com/asp/referrence/index.asp下一个ADO参考看看,相信会揭开你的心中疑团。 

OK,让我们一起期待明天吧! ^&^ 
文章页数:[1] 
帮助你我他: 1.我有问题请教 2.我要投稿>>>
更多相关资料搜索:
热点文章
最新文章
相关文章
版权申明:除部分特别声明不要转载,或者授权本站独家播发的文章外,大家可以自由转载本站的原创文章,但原作者和来自本站的链接必须保留(非本站原创的,按照原来自一节,自行链接)。文章版权归本站和作者共有。
转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去本站水印。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论  打印  刷新  推荐给朋友  返回顶部  关闭

网上大名: