1:假设服务器端有文件test.rar:对应的地址是:http://localhost:34270/ClientBin/test.rar:

2:Silverlight要下载这个文件的方式很简单:使用HyperLinkButton就可以了:

<HyperlinkButton NavigateUri="http://localhost:34270/ClientBin/test.rar" Content="使用HyperLinkButton来下载test.rar" />

运行效果如下:

3:但是这种方法有个限制,假设我们要下载的文件是保存在数据库中呢?(本人严重反对将文件存在数据库中),或者是其他什么,能不能使用WebRequest来下载呢?

当然能!!

4:首先在前台添加下载按钮代码:

<Button Content="使用WebRequest来下载" Click="Download_Click" />

后台代码如下:

private void Download_Click(object sender, RoutedEventArgs e)
{string filePath = "http://localhost:34270/ClientBin/test.rar";WebRequest request = WebRequest.Create(filePath);request.BeginGetResponse((responseAsyncCallBack) =>{SaveFileDialog sfd = new SaveFileDialog();string extension = System.IO.Path.GetExtension(filePath);sfd.Filter = string.Format("*{0}| *{0}", extension);if (sfd.ShowDialog() == true){Stream openFileStream = sfd.OpenFile();#region 获取response bytesWebResponse response = request.EndGetResponse(responseAsyncCallBack);Stream responseStream = response.GetResponseStream();Byte[] bufferBytes = new Byte[responseStream.Length];responseStream.Read(bufferBytes, 0, bufferBytes.Length);#endregionopenFileStream.Write(bufferBytes, 0, bufferBytes.Length);openFileStream.Flush();}}, null);}

因为request.BeginGetResponse是异步的,所以在获取Response之后再弹出保存按钮。

聪明的你能看出这段代码的问题吗??

运行结果如下:

错误是只能对UI线程执行操作,难道需要使用BeginInvoke??

OK,修改代码:

request.BeginGetResponse((responseAsyncCallBack) =>

{

this.Dispatcher.BeginInvoke(() =>

{ //code});

}, null);

继续运行,结果如下:

情况是这样的,微软为了保证对话框必须由用户启动,所以任何尝试使用委托,或代码的方式来弹出对话框都会抛出SecurityException.

那么如何做呢?

首先SaveFileDialog必须在Download_Click事件里面,这样才不会抛出SecurityException.

所以在WebRequest request = WebRequest.Create(filePath);的后面增加代码:

//判断是否需要下载bool needDownload = false;SaveFileDialog sfd = new SaveFileDialog();string extension = System.IO.Path.GetExtension(filePath);sfd.Filter = string.Format("*{0}| *{0}", extension);if (sfd.ShowDialog() == true){needDownload = true;}

接着修改BeginGetResponse,在needDownload为true的时候开始下载文件:

if (needDownload)

{

request.BeginGetResponse((responseAsyncCallBack) =>

{

this.Dispatcher.BeginInvoke(() =>

{

using (Stream openFileStream = sfd.OpenFile())

{

#region 获取response bytes

WebResponse response = request.EndGetResponse(responseAsyncCallBack);

Stream responseStream = response.GetResponseStream();

Byte[] bufferBytes = new Byte[responseStream.Length];

responseStream.Read(bufferBytes, 0, bufferBytes.Length);

#endregion

openFileStream.Write(bufferBytes, 0, bufferBytes.Length);

openFileStream.Flush();

}

});

}, null);

}

完整的代码如下:

/// <summary>

/// 下载按钮点击事件

/// </summary>

private void Download_Click(object sender, RoutedEventArgs e)

{

string filePath = "http://localhost:34270/ClientBin/test.rar";

WebRequest request = WebRequest.Create(filePath);

//判断是否需要下载

bool needDownload = false;

SaveFileDialog sfd = new SaveFileDialog();

string extension = System.IO.Path.GetExtension(filePath);

sfd.Filter = string.Format("*{0}| *{0}", extension);

if (sfd.ShowDialog() == true)

{

needDownload = true;

}

if (needDownload)

{

request.BeginGetResponse((responseAsyncCallBack) =>

{

this.Dispatcher.BeginInvoke(() =>

{

using (Stream openFileStream = sfd.OpenFile())

{

#region 获取response bytes

WebResponse response = request.EndGetResponse(responseAsyncCallBack);

Stream responseStream = response.GetResponseStream();

Byte[] bufferBytes = new Byte[responseStream.Length];

responseStream.Read(bufferBytes, 0, bufferBytes.Length);

#endregion

openFileStream.Write(bufferBytes, 0, bufferBytes.Length);

openFileStream.Flush();

}

});

}, null);

}

}

完全详解--Silverlight 下载文件相关推荐

  1. 技术揭秘之详解回收站删除文件恢复

    |=------------------------------------------------------------------------=| |=--------------=[技术揭秘之 ...

  2. 详解Maven下载安装及IDEA配置Maven (2023最新)

    文章目录 一.Maven介绍 二.下载Maven 三.配置Maven环境 四.在Idea上配置Maven工具 一.Maven介绍 1.Maven翻译为"专家", "内行& ...

  3. FreeMarker基本语法详解及模板文件的组成(二)

    海浪上次给大家分享了FreeMarker基本语法详解及模板文件的组成(一)海浪今天继续分享FreeMarker基本语法详解及模板文件的组成(二) 3.2 输出变量值<?xml:namespace ...

  4. python怎么导入文件-Python文件如何引入?详解引入Python文件步骤

    python基本语法--引入Python文件 1.新建python文件 :在同目录lib下创建mylib.py和loadlib.py两个文件 2.在mylib.py文件中创建一个Hello的类 并且给 ...

  5. linux rm命令参数及用法详解---linux删除文件或目录命令

    http://www.linuxso.com/command/rm.html linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个 ...

  6. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...

    文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...

  7. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  8. 详解HTTP的文件上传全过程(RFC1867协议)

    详解HTTP的文件上传全过程:RFC1867协议 HTTP请求头 HTTP请求体 什么是 multipart/form-data 上传文件信息的内容组成 原生Node实现客户端上传文件 原生Golan ...

  9. eclipse版本详解以及下载安装步骤及启动eclispe报错整理

    一.eclispe版本详解 本段内容转载自:https://www.cnblogs.com/chenmingjun/p/8404628.html 1.eclipse版本代号一览表 Eclipse的设计 ...

最新文章

  1. C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define
  2. 如何用ActionScript制作绚丽的特效——Silk
  3. CNN的卷积运算为何使用互相关而不是卷积
  4. 你是信用卡卡奴吗?怎么摆脱卡奴?
  5. android onlescan 参数,Android BLE:从iOS外设广告时,在onLeScan()回调中检索服务UUID
  6. oracle for函数,oracle分区表述的FOR语句(一)
  7. 使用scikit中的聚类
  8. 牛客14342 神奇的数字
  9. 排序算法以及基本数据结构
  10. [渝粤教育] 浙江大学 物理光学实验及仿真 参考 资料
  11. 适合python组态软件_组态软件哪个好
  12. 聊天室消息敏感词替换 用户微信公众号聊天室敏感词过滤
  13. Python tinypng 压缩脚本
  14. 等级保护三级测评-----云计算安全扩展要求
  15. Java高并发编程实战5,异步注解@Async自定义线程池
  16. python matrix用法_详解使用python绘制混淆矩阵(confusion_matrix)
  17. 【平衡小车制作】(四)陀螺仪MPU6050(超详解)
  18. 10105 - Polynomial Coefficients
  19. saveFile()方法
  20. 《ChatGPT》自动写代码、写作文,使用教程来了

热门文章

  1. Microsoft Azure 云存储服务概念
  2. ORM-Dapper:Dapper百科
  3. docker 安装vim
  4. mysql免安装教程
  5. 什么是SCADA Viewer
  6. js获取及判断按键的方法
  7. sublime福音:微信小程序组件及API补全插件
  8. 【日志】2011.12.24
  9. 自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案
  10. IDEA配置maven报错解决方案