var competitive=new {technique,business}

2008/8/25

关于文件夹的上传

一个web项目中有一个模块要实现如下功能:(1)上传大文件(2)同时上传多个文件(3)可以选择文件夹上传并且保持文件夹结构,大文件上传原来用 Dj.Blog.FileUpload 改造实现过,上传多个文件使用swfupload也可以实现,但是选择文件夹并上传就麻烦了,google发现ActiveXPowUpload 可以实现这个功能,但是软件是收费的而且电驴和网上都没找到可用的破解,暂时决定使用.net 实现以ie为宿主的winform usercontrol,文件夹以及文件的选择都很好实现,但是还存在如下问题:
(1)权限问题:由于该控件需要访问磁盘文件所以在ie中使用.net控件时必须对该控件授予特定的权限,权限是通过管理工具下的.net framework配置工具管理的。但是在.net framework2.0里该配置工具没有随分发包安装而只有安装2.0的sdk才会有,这儿是一篇讲解如何在没有安装sdk的机器上添加配置工具的文章,下面评论所可以用但是我在08系统下尝试了一下好像不行也就是说对vista的支持也应该不是很好。这这一点上要么让客户安装庞大的sdk要么让客户手动去配置,两者都不是什么好解决方案。
(2)采用ftp作服务器端的问题:使用ftp作为服务器端在处理文件夹和大文件上比较方便,但是客户端的登录是个问题要么让客户上传文件时再输入ftp的帐号和密码,要么把密码和账户以明文形式传给usercontrol(object)的parma部分,登录时控件读取相应属性登录,还有一个方案是把用户名和密码写死到控件里,一个繁琐一个不安全一个不灵活。还有一个问题是没有找到好的ftp库,在codeproject上找了几篇文章看了一下也使用了相应的库做了一下实验效果不太理想.暂时放弃使用ftp作服务器端的方案。
(3)使用iis作为服务器端的问题:使用iis作服务器端时文件夹的建立使用httphandler可以搞定,大文件的处理还是用原来的大文件处理模块只是稍微改造一下使其只对包含设定的字符的页面进行处理,这样客户端控件中使用httpwebrequest进行连接请求特殊页面就可以进行文件上传了,在使用forms方式进行认证的方式下httpwebrequest进行文件上传请求前应先请求登录页并修改viewstate模拟登录并保存认证。这儿是一篇详细的说明,但是这种方式还是需要在控件中使用用户名和密码还是不安全现在的方法是写一个算法传递param时加密而在user control中解密。还有一个问题是缓存问题当上传大文件时如果将数据都读入requeststream会导致outofmemory问题,参考这篇文章设置request的AllowWriteStreamBuffering属性为false,下面的评论很多人都说可行,但是我的也出现了其中一个人说的“This request requires buffering data to succeed”,后来参考这篇文章实现form-auth而不是用ntlm可以正常使用。

0 评论: