Silverlight实现上传及下载(一)-WCF 上传下载实现

用到的知识简介

Silverlight调用WCF简介

请参考

Silverlight调用WebClient简介

Siverlight中很多时候我们需要上传下载功能,WebClient提供了两种工作方式来实现上传下载功能。(可参考http://www.xiaoniusoft.com/Libary/Details/2872.aspx上的资料)

A、以字符串形式下载和上传数据

使用WebClient可以以字符串形式下载数据,当请求一个指定地址的字符串时,调用DownloadStringAsync方法,操作完成后将触发 DownloadStringCompleted事件,在该事件处理方法中能够接收到一个类型为 DownloadStringCompletedEventArgs的参数,它的Result属性的类型为String,我们可以通过该属性来获得最终的字符串结果,它可以是一段普通的文本或一段XML文本等。

B、 以流形式下载和上传数据

使用WebClient同样可以以流形式下载数据,当请求下载的资源是一个流时,可调用OpenReadAsync方法,此操作完成后将触发 OpenReadCompleted事件,在该事件处理方法中能够接收到一个类型为OpenReadCompletedEventArgs的参数,它的 Result属性类型为Stream,使用此属性能够获取到最终的流结果。

WebClient的主要函数如下:

•OpenReadAsync 打开流向指定资源的可读流。

•OpenWriteAsync 打开一个流以将数据写入指定的资源。这些方法不会阻止调用线程。

•DownloadStringAsync 以字符串形式下载位于指定 Uri 的资源。

•UploadStringAsync 将指定的字符串上载到指定的资源。这些方法不会阻止调用线程。

WebClient的主要事件如下:

•OpenReadCompleted 在异步资源读取操作完成时发生。

•OpenWriteCompleted 在打开流以将数据写入资源的异步操作完成时发生。

•DownloadStringCompleted 在异步资源下载操作完成时发生。

•DownloadProgressChanged 在异步下载操作成功传输部分或全部数据后发生。

•UploadStringCompleted 在异步字符串上载操作完成时发生。

•UploadProgressChanged 在异步上载操作成功转换部分或全部数据后发生。

Silverlight调用WebService简介

在Silverlight中较为简单的一种上传文件的方式,就是将客户端的文件序列化为Byte[]字符组,然后服务端使用WebService连接客户端的数据并还原为文件。

当然我问在使用WebService完成上传下载功能的时候,还得使用一个“一般处理程序”来辅助完成此项任务。

WCF方式思路及功能实现

难点解析

一.上传文件时的端口不一致问题

一般有两种方法来操作端口。

一种是通过右键Silverlight Web服务端选择“属性”子菜单,在Web选项卡中将“使用Visual Studio开发服务器”的“特定端口”勾选,并填入固定的端口号;

另一种是在Uri中通过代码动态获得当前的web请求的端口号;

这里推荐使用第二种方法。例如:HtmlPage.Document.DocumentUri.Port ,其中通过System.Windows.Browser命名空间下的HtmlPage类来动态捕获端口,当然也可以通过给方法中的DocumentUri的其他属性值来获得服务端主机的IP地址等其他信息。

二.上传文件存放路径问题

Silverlight客户端不支持对服务端路径的直接操作。故而一般通过某种数据服务间接操作。其实现方式是通过Uri地址中加入数据服务名的方法将该操作请求转到服务端中建立的服务处理类中来进行。如WCF服务中可通过Client.Endpoint.Address=new EndpointAddress("http://localhost:" +HtmlPage.Document.DocumentUri.Port +"/SilverlightUploader.Web/FileService.svc")来将客户端操作引入服务端进行。

上传功能实现

实现思路:将本地打开的文件流读入字节数组中,并将该字节数组传递到服务端,在服务端将字节数组还原为文件并保存。

使用OpenFileDialog获得上传文件流,并写入字节数组传递到服务端。

private void cmdUpload_Click(object sender, RoutedEventArgs e)

{

OpenFileDialog openDialog = new OpenFileDialog();

if (openDialog.ShowDialog() == true)

{

Try

{

using (Stream stream = openDialog.File.OpenRead())

{

// 限制上传文件大小

if (stream.Length > 5000000)

{

MessageBox.Show("文件不得大于5M “);

}

else

{

byte[] data = new byte[stream.Length];

stream.Read(data, 0, (int)stream.Length);//将当前流读入字节数组中

client.UploadFileAsync(openDialog.File.Name, data);//将文件名和字节数组传递到服务端

}

}

}

catch

{

MessageBox.Show(“上传文件失败”);

}

}

}

// 服务端还原文件并保存

// 在服务端建立的WCF服务中加入契约函数如下:

/// <summary>

/// 还原文件并保存

/// </summary>

/// <param name="fileName">上传文件名</param>

/// <param name="data">上传文件字节数组</param>

[OperationContract]

public void UploadFile(string fileName, byte[] data)

{

//服务端建立一个名为Files的文件夹,filePath即为该目录映射的物理路径

filePath = HttpContext.Current.Server.MapPath("Files");

string file = Path.Combine(filePath, Path.GetFileName(fileName));

using (FileStream fs = new FileStream(file, FileMode.Create))

{

fs.Write(data, 0, (int)data.Length); //还原文件

}

}

//下载功能实现

//服务端将存在的文件转化为字节数组回传到客户端

/// <summary>

/// 将指定文件转化为字节数组传回客户端

/// </summary>

/// <param name="fileName">指定文件名</param>

/// <returns>文件字节数组</returns>

[OperationContract]

public byte[] DownloadFile(string fileName)

{

//路径的定义同上

string file = Path.Combine(filePath, Path.GetFileName(fileName));

using (FileStream fs = new FileStream(file, FileMode.Open))

{

byte[] data = new byte[fs.Length];

fs.Read(data, 0, (int)fs.Length);

return data;

}

}

//客户端还原文件并保存

//在单击事件中通过SaveFileDialog来还原文件

private void cmdDownload_Click(object sender, RoutedEventArgs e)

{

if (lstFiles.SelectedIndex != -1)

{

SaveFileDialog saveDialog = new SaveFileDialog();

if (saveDialog.ShowDialog() == true)

{

client.DownloadFileAsync(“这里传入下载文件名”,saveDialog);

//注意:此处传入了一个服务端为定义的一个参数,目的是为了标识异步操作完成时接受文件的SaveFileDialog,但WCF服务中的函 数定义为public byte[] DownloadFile(string fileName)无需加入第二个参数的定义。

}

}

}

private void client_DownloadFileCompleted(object sender, DownloadFileCompletedEventArgs e)

{

if (e.Error == null)

{

SaveFileDialog saveDialog = (SaveFileDialog)e.UserState;//获得标识的SaveFileDialog

using (Stream stream = saveDialog.OpenFile())

{

stream.Write(e.Result, 0, e.Result.Length);

}

}

else

{

MessageBox.Show(“下载失败”);

}

}

转载于:https://www.cnblogs.com/yidifanhua/archive/2011/07/31/2122710.html

Silverlight 上传下载之三种方式解析相关推荐

  1. 文件上传的三种方式-Java

    前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...

  2. vue获取上传图片的名字和路径_使用Vue实现图片上传的三种方式

    项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来. 没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务 ...

  3. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

  4. Android图片上传的两种方式

    图片上传,以及带参数的图片上传是Android开发中,很常见的需求.但也是接口联调难度相对比较大的技术实现,本文介绍两种可靠的图片上传方式.一是通过 MultipartBody 来实现:二是通过图片转 ...

  5. python实现selenium文件上传的两种方式

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...

  6. HTML5 文件上传的2种方式

    原文地址:http://blog.csdn.net/lovelyelfpop/article/details/71421123 以前上传文件需要提交Form表单. HTML5方式上传文件,可以通过使用 ...

  7. 图片上传的两种方式(前端和后端)

    1:前端 HTML: <html> <script type="text/javascript" src="js/jquery-3.1.1.min.js ...

  8. Android 文件上传的几种方式

    这两天和新来的同事做一个项目,用到了文件上传,在这里记录下历程 Android文件上传有各种各样的Http框架,我也就简单说说我常用的吧,LiteHttp,OkHttp的封装还没做完全,有时间会补上, ...

  9. 图片上传下载-功能实现

    文件上传下载 三种方式实现文件上传功能 1. 传统form表单(基本被废弃) 向后台发送数据的三种编码格式 -form表单的enctype属性 application/x-www-form-urlen ...

最新文章

  1. 建议你吃透这68个内置函数!
  2. Java设计模式(16)中介模式(Mediator模式)
  3. linux安卓双系统板子,安卓迷你 PC 主机只要 109 美元,支持 Android 和 Linux 双系统...
  4. 国内下载 Python 源码特别慢
  5. Git 常用命令速查表(图文+表格)【转】
  6. html5图片怎么顶格,iQOO 5系列几乎达到了“顶格”的性能状态。
  7. 两用物项许可证办理流程_办理医疗器械经营许可证流程
  8. 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)
  9. 原子操作和互斥锁的区别
  10. 制造跨度 makespan是什么
  11. 2.python制作的倒计时小工具
  12. 更改C盘用户文件夹名
  13. ios开发App的图标背景色不能是透明
  14. ERD图“乌鸦脚”形式表示的关系的使用方法与理解
  15. 东邪、西毒、南帝、北丐、中神通五大操作系统之华山论剑(独评)
  16. 知物由学 | iOS AssetBundle资源保护
  17. 20瓶可乐java,【Java】Java初级算法基础 ,可乐瓶数问题
  18. Xtrabackup全量备份(官网)
  19. 剑指Offer(1)——第一章面试的流程
  20. sw槽钢插件_Solidworks GB结构构件-GB3D型材库(几乎包含常用的各种型材)

热门文章

  1. 如何编写列名中带有空格的SQL查询
  2. 重磅!如何才能通过一线互联网公司面试?面试必问
  3. 飞桨2.0应用案例教程 — 用BERT实现自动写诗
  4. pde与波长 sipm 关系_详解硅光电倍增管的结构特点和优势
  5. IPGuard加密邮件白名单为什么不生效
  6. 桌面多出一个IE图标,删除方法
  7. 【SQL数据库设计】数据库设计【小型数据库】
  8. 英语学得好,月薪高出10000块?真正影响职场的能力,9成国人有欠缺!
  9. [论文阅读笔记41]关于医学的bert专题
  10. MDK报错:NO BROWSE INFORMATION AVAILABLE IN...