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

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
K
Kaspersky official blog
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security @ Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
Attack and Defense Labs
Attack and Defense Labs
Jina AI
Jina AI
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
H
Help Net Security
V
Visual Studio Blog
宝玉的分享
宝玉的分享
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threat Research - Cisco Blogs
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
Latest news
Latest news
T
Tor Project blog
I
Intezer
美团技术团队
GbyAI
GbyAI
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
Y
Y Combinator Blog
博客园 - 司徒正美
T
Tenable Blog
O
OpenAI News
N
News and Events Feed by Topic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
Help Net Security
Help Net Security

博客园 - 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 开发环境搭建 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安全选项的,每个客户端都会安装,所以也就没有问题。