摘要
我们的系统有附件功能,在下载附件时,有时会下载多个附件,系统采用了把多个附件一起打包成zip文件下载的方式,这样下载过来是个压缩包,客户最近提出,他们不会解压缩这个压缩包,或者客户机器上根本就没有安装压缩软件,客户感觉使用起来很不方便(没办法,这种需求也真够空前的),好吧,谁让上帝开口了呢,一个字“做”。
思路
思路1:每次点击下载的时候启动多个<a>标签,这样比较简单,缺点是,没下载一个文件需要点一次保存。如果有10个以上,客户就晕菜了。
思路2:在1个http请求里面下载多个文件,想用http长连接的形式(comet框架)请教了一些朋友,放弃了。或许也能够做成,有时间再看看。
思路3:用flex/flash来下载文件,并保存在客户端(对这块不熟悉,放弃了)
思路4:使用silverlight来下载文件,先把zip压缩包下载过来,再解压。(做下来了,但比较坎坷,对客户端设置要求严格)
过程
首先是下载zip文件到客户端,这个比较简单,采用万能的WebClient就可以搞定
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.OpenReadAsync(new Uri(uri));这样就可以下载zip到客户端,只不过是文件流而已。
接下来是要解压zip里面的文件,由于目前silverlight里面已经可以访问压缩文件里的资源了,就地取材,如下:
Uri uri = new Uri(fileName, UriKind.Relative);
StreamResourceInfo zipPackageSri = new StreamResourceInfo(zipStream, null);
StreamResourceInfo textSri = Application.GetResourceStream(zipPackageSri, uri);文件取到了,开始写文件到本地磁盘,但是现在发现,没有办法让客户选择本地文件夹,(有个工程是FolderDialogSL4的,可以选择本地文件夹,但要求能够脱离浏览器运行,故没有采用)一时没有好的解决方法,就采用了只有IE才可以的特性,使用JS来浏览本地文件夹,但是要求安全选项如下:
/// 选择文件夹
/// 特别注意的是,由于安全方面的问题,你还需要如下设置才能使本JS代码正确运行,否者会出现"没有权限"的问题.
/// 1.设置可信任站点(例如本地的可以为:http://localhost)
/// 2.其次:可信任站点安全级别自定义设置中:设置下面的选项"对没有标记为安全的ActiveX控件进行初始化和脚本运行"----"启用" 好了,可以选择本地文件夹了,该保存文件了,要保存本地文件也需要设置silverlight工程选项的-在浏览器内运行时需要提升的信任,如下图:
要注意了,勾选这个是要付出代价的,代价如下(要么改注册表,要么做证书签名):
操作本地磁盘是需要silverlight可以在浏览器内完全受信任运行特性的
部署时,需要修改客户端注册表或者设置xap文件的域管理员证书,详情请看下面链接
http://www.pitorque.de/MisterGoodcat/post/Silverlight-5-Tidbits-Trusted-applications.aspx
注册表项如下:
Key path for 32-bit computers: HKEY_LOCAL_MACHINE\Software\Microsoft\Silverlight\
Key path for 64-bit computers: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Silverlight\
Value name: AllowElevatedTrustAppsInBrowser
Value type: DWORD
Valid Values:
Disabled - 0x00000000
Enabled - 0x00000001
付出代价情况下,是完成了!
幸好的是我们的系统是有个浏览器外壳的,专门做activex控件的注册与修复工作,还有设置IE安全选项的,每个客户端都会安装,所以也就没有问题。