32.WebClient上传String、下载String、上传Stream流、下载Stream流

简介:

        Silverlight中我们很多时候需要上传下载数据的时候,在本节将讲述使用WebClient上传String、下载String、上传Stream流、下载Stream流的4个方法和相应的事件。下面我们首先认识一下WebClient类。

        WebClient的主要函数如下:

             •OpenReadAsync 打开流向指定资源的可读流。 
             •OpenWriteAsync 打开一个流以将数据写入指定的资源。这些方法不会阻止调用线程。 
             •DownloadStringAsync 以字符串形式下载位于指定 Uri 的资源。 
             •UploadStringAsync 将指定的字符串上载到指定的资源。这些方法不会阻止调用线程。

        WebClient的主要事件如下:
             •OpenReadCompleted 在异步资源读取操作完成时发生。 
             •OpenWriteCompleted 在打开流以将数据写入资源的异步操作完成时发生。
             •DownloadStringCompleted 在异步资源下载操作完成时发生。 
             •DownloadProgressChanged 在异步下载操作成功传输部分或全部数据后发生。
             •UploadStringCompleted 在异步字符串上载操作完成时发生。  
             •UploadProgressChanged 在异步上载操作成功转换部分或全部数据后发生。

        上面的函数和事件在Silverlight的API中有详细的解释,在本文中不再复述。下面我们来看看一个实例来使用WebClient上传String、下载String、上传Stream流、下载Stream流。

        首先我们准备XAML文件的前台代码,其内有四个按钮,分别代表上传String、下载String、上传Stream流、下载Stream流的按钮。代码如下:

 

 
  1. <Grid x:Name="LayoutRoot" Background="White"
  2. <Canvas Name="lRoot"></Canvas> 
  3. <Button Content="WebClient下载XAP" Height="23" HorizontalAlignment="Left" Margin="410,60,0,0" Name="button1" VerticalAlignment="Top" Width="178" Click="buttonOpenReadAsync_Click" /> 
  4. <Button Content="DownloadStringAsync下载XML" Height="23" HorizontalAlignment="Left" Margin="410,100,0,0" Name="button2" VerticalAlignment="Top" Width="178" Click="buttonDownloadStringAsync_Click" /> 
  5. <Button Content="UploadStringAsync上传String" Height="23" HorizontalAlignment="Left" Margin="410,140,0,0" Name="button3" VerticalAlignment="Top" Width="178" Click="buttonUploadStringAsync_Click" /> 
  6. <Button Content="OpenWriteAsync上传图片" Height="23" HorizontalAlignment="Left" Margin="410,180,0,0" Name="button4" VerticalAlignment="Top" Width="178" Click="buttonOpenWriteAsync_Click" /> 
  7. </Grid> 

上传String操作如下:

        首先建立一个TestHandle.ashx,向这个文件内部写入以下代码以接收Silverlight中上传的String字符。

 

 
  1. /// <summary> 
  2. /// TestHandle 的摘要说明 
  3. /// </summary> 
  4. public class TestHandle : IHttpHandler 
  5.  
  6. public void ProcessRequest(HttpContext context) 
  7. int bytelength = context.Request.ContentLength; 
  8. byte[] inputbytes = context.Request.BinaryRead(bytelength); 
  9. string message = System.Text.Encoding.Default.GetString(inputbytes); 
  10. context.Response.ContentType = "text/plain"
  11. context.Response.Write("你已经提交数据:" + message); 
  12.  
  13. public bool IsReusable 
  14. get 
  15. return false

        我们再看Silverlight端代码如下:

 

 
  1. #region UploadStringAsync上传String 
  2. private void buttonUploadStringAsync_Click(object sender, RoutedEventArgs e) 
  3. //开始调用UploadStringAsync异步上传String 
  4. Appclient.UploadStringAsync(new Uri("http://localhost:3993/TestHandle.ashx", UriKind.RelativeOrAbsolute), "<TD></TD>"); 
  5. Appclient.UploadStringCompleted += new UploadStringCompletedEventHandler(Appclient_UploadStringCompleted); 
  6.  
  7. void Appclient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
  8. MessageBox.Show(e.Result); 
  9. Appclient.UploadStringCompleted -= new UploadStringCompletedEventHandler(Appclient_UploadStringCompleted); 
  10. #endregion 

下载String操作如下:

        下载ClientBin目录下已经存在的XML文件

 

 
  1. #region DownloadStringAsync下载XML 
  2. private void buttonDownloadStringAsync_Click(object sender, RoutedEventArgs e) 
  3. //开始调用DownloadStringAsync异步下载文档并且读取它 
  4. Appclient.DownloadStringAsync(new Uri("http://localhost:3993/ClientBin/222.xml", UriKind.RelativeOrAbsolute)); 
  5. Appclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Appclient_DownloadStringCompleted); 
  6. void Appclient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
  7. MessageBox.Show(e.Result); 
  8. Appclient.DownloadStringCompleted -= new DownloadStringCompletedEventHandler(Appclient_DownloadStringCompleted); 
  9. #endregion 

上传Stream操作如下:

        建立一个AddFileHandle.ashx,向这个文件内部写入以下代码以接收Silverlight中上传的Stream数据流。

 

 
  1. /// <summary> 
  2. /// AddFileHandle 的摘要说明 
  3. /// </summary> 
  4. public class AddFileHandle : IHttpHandler 
  5.  
  6. public void ProcessRequest(HttpContext context) 
  7. //获取上传的数据流 
  8. using (Stream sr = context.Request.InputStream) 
  9. string filename = "Fir"
  10. byte[] buffer = new byte[4096]; 
  11. int bytesRead = 0; 
  12. //将当前数据流写入ClientBin文件下Fir.jpg文件中 
  13. using (FileStream fs = File.Create(context.Server.MapPath("ClientBin/" + filename + ".jpg"), 4096)) 
  14. while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) 
  15. //将数据写入文件 
  16. fs.Write(buffer, 0, bytesRead); 
  17.  
  18. public bool IsReusable 
  19. get 
  20. return false

        Silverlight读取图片数据,然后传到服务器端(注:此处没有验证传什么数据,如有需要自己调用OpenFileDialog.Filter即可),代码如下:

 

 
  1. #region OpenWriteAsync上传图片 
  2. private void buttonOpenWriteAsync_Click(object sender, RoutedEventArgs e) 
  3. OpenFileDialog dialog = new OpenFileDialog(); 
  4. if (dialog.ShowDialog() == true
  5. //开始调用OpenWriteAsync方法上传数据 
  6. Appclient.OpenWriteAsync(new Uri("http://localhost:3993/AddFileHandle.ashx", UriKind.RelativeOrAbsolute), "POST", dialog.File.OpenRead()); 
  7. Appclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(Appclient_OpenWriteCompleted); 
  8. void Appclient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) 
  9. //将图片数据流发送到服务器上 
  10. Stream inputStream = e.UserState as Stream; 
  11. Stream outputStream = e.Result; 
  12.  
  13. byte[] buffer = new byte[4096]; 
  14. int bytesRead = 0; 
  15. while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
  16. outputStream.Write(buffer, 0, bytesRead); 
  17. outputStream.Close(); 
  18. inputStream.Close(); 
  19. MessageBox.Show("图片上传成功!"); 
  20. Appclient.OpenWriteCompleted -= new OpenWriteCompletedEventHandler(Appclient_OpenWriteCompleted); 
  21. #endregion 

下载Stream操作如下:

        本例采用上一节的源码,下载Stream流,然后反射为对象,源码如下:

 

 
  1. #region OpenReadAsync下载XAP 
  2. private void buttonOpenReadAsync_Click(object sender, RoutedEventArgs e) 
  3. //1 •使用WebClient下载SLRandarHitTest.xap文件,进行异步读取。 
  4. Appclient.OpenReadAsync(new Uri("SLRandarHitTest.xap", UriKind.Relative)); 
  5. Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted); 
  6.  
  7. void Appclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
  8. CreateXAPResource("SLRandar.dll""SLRandar.MainPage", e.Result); 
  9. Appclient.OpenReadCompleted -= new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted); 
  10. /// <summary> 
  11. /// 创建XAP包的反射实例并且加装到Canvas中 
  12. /// </summary> 
  13. /// <param name="dllStr">XAP包中的编译完成的运行代码的DLL文件</param> 
  14. /// <param name="mainStr">需要实例化的启动页面</param> 
  15. /// <param name="resultStream">使用WebClient下载到的数据流</param> 
  16. private void CreateXAPResource(string dllStr, string mainStr, Stream resultStream) 
  17. //3 •获取其他包提供的资源流信息 
  18. StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new StreamResourceInfo(resultStream as Stream, null), new Uri(dllStr, UriKind.RelativeOrAbsolute)); 
  19. //4 •对Stream进行反射 
  20. AssemblyPart assemblyPart = new AssemblyPart(); 
  21. Assembly assembly = assemblyPart.Load(streamResourceInfo.Stream); 
  22. //5 •(创建实例 
  23. var uc = (UserControl)assembly.CreateInstance(mainStr); 
  24. lRoot.Children.Clear(); 
  25. lRoot.Children.Add(uc); 
  26. #endregion 

        本节实例采用VS2010+Silverlight 4.0编写。如需源码点击 SLWebClient.rar 下载。



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/822560

相关文章
|
Java API
利用Stream流List<实体类>转List<String>或List<String>转List<String>
利用Stream流List<实体类>转List<String>或List<String>转List<String>
1482 0
|
存储 JavaScript 前端开发
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
147 0
|
3月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
77 0
|
6月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
141 11
|
6月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
146 9
|
6月前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
|
10月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
288 2