惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - herobeast

hadoop 2.7.1 高可用安装部署 Redis篇 MySql篇 Tomcat篇 JDK篇 Implementing a Custom Security Manager(翻译) 腾达路由器设置 正则表达式 jQuery Resizable笔记 OSGi规范 OSGi bundle 与 fragment OSGi bundle之间互相通信的方法 Apache CXF 分布式OSGi部署HelloWorld 五米测试 Spring.DM web 开发环境搭建 - herobeast Spring.DM版HelloWorld 腾讯资深产品经理谈敏捷开发于游戏 js矢量图类库:Raphaël—JavaScript Library 关于生成id的问题
web一次下载多个附件
herobeast · 2013-01-04 · via 博客园 - herobeast

摘要

我们的系统有附件功能,在下载附件时,有时会下载多个附件,系统采用了把多个附件一起打包成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安全选项的,每个客户端都会安装,所以也就没有问题。