WebClient思路及功能实现

实现思路:通过新建一个“一般处理程序”WebClientUpLoadStreamHandler.ashx配合完成,

Silverlight打开文件,获取文件流,webclient调用openwrite方法,请求服务器,打开一个可以写进流InputStream。

当该可写进流可用的时候,相应openwrite异步方法的一个回调事件,在该事件中将文件流写进到HTTP的可写进流。服务器端接收到输进流后写进到文件流保存。

服务端使用ASHX一般处理程序来作为接受页。

本程序中添加“一般处理程序”及其用法介绍请单击此处,关于一般处理程序的详细理论介绍请参考http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html

上传功能实现

一.选择本地图片并指定上传处理上传的一般处理程序

/// <summary>

/// 上传事件通过对话框来选择上传文件

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void buttonUpload_Click(object sender, RoutedEventArgs e)

{

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*";

openFileDialog.Multiselect = false;

if (openFileDialog.ShowDialog()==true)

{

fileinfo = openFileDialog.File;

if (fileinfo!=null)

{

WebClient webclient = new WebClient();

string uploadFileName = fileinfo.Name.ToString();

Uri upTargetUri = new Uri(String.Format                     ("http://localhost:"+HtmlPage.Document.DocumentUri.Port+"/WebClientUpLoadStreamHandler.ashx?fileName={0}", uploadFileName), UriKind.Absolute); //指定上传处理程序

webclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler (webclient_OpenWriteCompleted);

//webclient.Headers["Content-Type"] = "multipart/from-data";

webclient.OpenWriteAsync(upTargetUri, "POST", fileinfo.OpenRead());

webclient.WriteStreamClosed += new WriteStreamClosedEventHandler(webclient_WriteStreamClosed);

}

else

{

MessageBox.Show("请选择想要上传的图片!!!");

}

}

}

void webclient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)

{

//将图片数据流发送到服务器上 e.UserState即为需要上传的客户端的流

Stream clientStream = e.UserState as Stream;

Stream serverStream = e.Result;

byte[] buffer = new byte[4096];

int readcount = 0;

//将需要上传的流读取到指定的字节数组中

while ((readcount = clientStream.Read(buffer,0,buffer.Length))>0)

{

//将指定的字节数组写入到目标地址的流

serverStream.Write(buffer, 0, readcount);

}

serverStream.Close();

clientStream.Close();

}

void webclient_WriteStreamClosed(object sender, WriteStreamClosedEventArgs e)

{

if (e.Error!=null)

{

System.Windows.Browser.HtmlPage.Window.Alert(e.Error.Message);

}

else

{

System.Windows.Browser.HtmlPage.Window.Alert("图片上传成功!!!");

c.GetFileListAsync();//这里是使用了WCF服务返回一下服务端的文件列表,共下载时选择

}

}

二.服务端获得上传流,并保存文件

服务端使用了一般处理程序来配合完成,如何添加一般处理程序请点击此处

public void ProcessRequest(HttpContext context)

{

string fileNamestr = context.Request.QueryString["fileName"];

Stream sr = context.Request.InputStream;//从客户端获得传入到服务端的文件流

try

{

byte[] buffer = new byte[4096];

int bytestRead = 0;

//将当前数据流写入服务器端指定文件夹下

string targetPath = context.Server.MapPath("UploadFiles/"+fileNamestr);

using (FileStream fs = File.Create(targetPath, 4096))

{/

//将当前流读入到字节数组中

while ((bytestRead = sr.Read(buffer, 0, buffer.Length)) > 0)

{

fs.Write(buffer, 0, bytestRead);

}

}

context.Response.ContentType = "text/plain";

context.Response.Write("上传成功");

}

catch (Exception e)

{

context.Response.ContentType = "text/plain";

context.Response.Write("上传失败,错误信息:" + e.Message);

}

finally { sr.Dispose(); }

}

下载功能实现

在客户端直接调用WebClient的自带方法和事件即可完成下载功能

private void buttonDownload_Click(object sender, RoutedEventArgs e)

{

if (listBox1.SelectedItems.Count<0)

{

MessageBox.Show("请选择要下载的下载文件");

}

else if (listBox1.SelectedItems.Count>1)

{

MessageBox.Show("暂不提供批量下载");

}

else

{

string imgUrl = "http://localhost:" + HtmlPage.Document.DocumentUri.Port + "/UploadFiles/" + listBox1.SelectedItem.ToString();

Uri endpoint = new Uri(imgUrl);

WebClient client = new WebClient();

//调用WebClient自身事件

client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);

//调用自身的Read方法完成下载

client.OpenReadAsync(endpoint);

}

}

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

Silverlight上传下载三种方式解析(二)相关推荐

  1. Silverlight 上传下载之三种方式解析

    Silverlight实现上传及下载(一)-WCF 上传下载实现 用到的知识简介 Silverlight调用WCF简介 请参考 Silverlight调用WebClient简介 Siverlight中 ...

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

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

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

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

  4. 大文件上传 问题解决三种方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  5. Vue路由传参三种方式

    Vue路由传参三种方式 params传参 路由属性配置传参 query传参 一.params传参 this.$router.push({ name:"admin", //这里的pa ...

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

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

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

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

  8. 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)

    目录 实现效果 原图大小8.46MB PIL库quality降低图片质量方式压缩图片366KB PIL库thumbnail压缩图片大小来压缩图片985KB OpenCV缩放图片大小来压缩图片 177K ...

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

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

  10. ASP.NET文件上传的三种基本方法

    ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. <form i ...

最新文章

  1. nginx日记分割脚本
  2. linux find 删除文件夹,linux中find与rm实现查找并删除目录或文件linux操作系统 -电脑资料...
  3. 织梦编辑器加HTML视频显示很小,织梦去掉编辑器自动加div的方法即大小字情况...
  4. linux中GIT组件,linux – 使用git和符号链接的基于组件的Web项目目录布局
  5. 【BZOJ1500】【codevs1758】维修数列,简析Splay的综合操作
  6. C# WinForm开发系列 - Thread/Delegate/Event
  7. java某校在积极推行无人监考,结构化面试题:高校无人监考你怎么看?
  8. window64位版本的secoclient工具下载(secoclient-win-64-7.0.2.26.exe)
  9. 4412 使用小度wifi
  10. Matlab 中三角函数
  11. Vue搭脚手架及创建项目
  12. E-Mobile 后台管理系统漏洞
  13. 墨魂服务器维修,2013年10月22日定期维护公告
  14. win10 node-sass安装python环境报错问题处理(自测可用版)
  15. 蓝牙芯片蓝牙模块音频发射器杂音噪音问题解决方案
  16. GB28181之国标编码
  17. LoRa技术特点和芯片总结
  18. 海典ERP与汉码盘点机对接门店实时盘点计划及程序使用方法,实时盘点,云盘点方案
  19. 惠普预装linux的笔记本,紧随戴尔 惠普PC也要预装Linux
  20. java list定义和初始化_在 Java 中初始化 List 的五种方法

热门文章

  1. xbot冬令营面试总结
  2. 在ARM板上,下载不同的东西使用不同的下载接口(加深理解)。
  3. socketChatRoom_Client(聊天室客户端)
  4. 计算机等级考试数据库三级模拟题2
  5. POLYCOM的设置方法(转载)
  6. android 编译 电脑卡,Android Studio 编译卡慢、卡顿的几种解决方案
  7. qmail邮件系统(三)qmail的工作原理和配置文件的设置
  8. 运行在容器中的Oracle XE - 11g
  9. 面试DevOps团队时可能会被到问哪些问题?
  10. 学习3D建模可以做什么?主要有几个就业方向,最挣钱的是哪个?