search了非常多的文章,总算勉强实现了。有许多不完善的地方。

在HCLoad.Web项目下新建目录Pics复制一张图片到根目录下。

图片名:Bubble.jpg 右击->属性->生成操作:Resource

UC_UpDown.xaml


大气象

<UserControl x:Class="HCLoad.UC_UpDown"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="500" Height="500">
    <StackPanel Background="White" Height="450">
        <Button Content="down" Click="Button_Click"></Button>
        <HyperlinkButton Content="下载保存" NavigateUri="http://localhost:4528/download.ashx?fileName=aa.txt" TargetName="_self" x:Name="lBtnDown" />
        <TextBlock x:Name="tbMsgString" Text="下载进度" TextAlignment="Center" Foreground="Green"></TextBlock>
        <Button x:Name="btnDownload" Content="DownLoad Pictures" Width="150" Height="35" Margin="15" Click="btnDownload_Click"/>
        <Border Background="Wheat" BorderThickness="5" Width="400" Height="280">
            <Image x:Name="imgDownLoad" Width="400" Height="300" Margin="15" Stretch="Fill"/>
        </Border>
        <Button x:Name="btnUpLoad" Content="UpLoad Pictures" Width="150" Height="35" Margin="15" Click="btnUpLoad_Click"/>
    </StackPanel>
</UserControl>

UC_UpDown.xaml.cs


大气象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes; using System.Windows.Media.Imaging; //因为要使用BitmapImage
using System.IO;  //因为要使用Stream namespace HCLoad
{
    public partial class UC_UpDown : UserControl
    {
        //1、WebClient 对象一次只能启动一个请求。如果在一个请求完成(包括出错和取消)前,即IsBusy为true时,进行第二个请求,则第二个请求将会抛出 NotSupportedException 类型的异常
        //2、如果 WebClient 对象的 BaseAddress 属性不为空,则 BaseAddress 与 URI(相对地址) 组合在一起构成绝对 URI
        //3、WebClient 类的 AllowReadStreamBuffering 属性:是否对从 Internet 资源接收的数据做缓冲处理。默认值为true,将数据缓存在客户端内存中,以便随时被应用程序读取         //获取选定图片信息
        System.IO.FileInfo fileinfo;
        public UC_UpDown()
        {
            InitializeComponent();
        }
        #region  下载图片
        private void btnDownload_Click(object sender, RoutedEventArgs e)
        {
            //向指定的Url发送下载流数据请求 
            String imgUrl = "http://localhost:4528/Bubble.jpg";
            Uri endpoint = new Uri(imgUrl);             WebClient client = new WebClient();
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(OnOpenReadCompleted);
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(clientDownloadStream_DownloadProgressChanged);
            client.OpenReadAsync(endpoint);
        }
        void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {             //OpenReadCompletedEventArgs.Error - 该异步操作期间是否发生了错误
            //OpenReadCompletedEventArgs.Cancelled - 该异步操作是否已被取消
            //OpenReadCompletedEventArgs.Result - 下载后的 Stream 类型的数据
            //OpenReadCompletedEventArgs.UserState - 用户标识             if (e.Error != null)
            {
                MessageBox.Show(e.Error.ToString());
                return;
            }
            if (e.Cancelled != true)
            {
                //获取下载的流数据(在此处是图片数据)并显示在图片控件中
                //Stream stream = e.Result;
                //BitmapImage bitmap = new BitmapImage();
                //bitmap.SetSource(stream);
                //imgDownLoad.Source = bitmap;
                Stream clientStream = e.UserState as Stream;
                Stream serverStream = (Stream)e.Result;
                byte[] buffer = new byte[serverStream.Length];
                serverStream.Read(buffer, 0, buffer.Length);
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Close();
                serverStream.Close();             }         }         void clientDownloadStream_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            //DownloadProgressChangedEventArgs.ProgressPercentage - 下载完成的百分比
            //DownloadProgressChangedEventArgs.BytesReceived - 当前收到的字节数
            //DownloadProgressChangedEventArgs.TotalBytesToReceive - 总共需要下载的字节数
            //DownloadProgressChangedEventArgs.UserState - 用户标识             this.tbMsgString.Text = string.Format("完成百分比:{0} 当前收到的字节数:{1} 资料大小:{2} ",
              e.ProgressPercentage.ToString() + "%",
              e.BytesReceived.ToString(),
              e.TotalBytesToReceive.ToString());         }         #endregion         #region  上传图片
        private void btnUpLoad_Click(object sender, RoutedEventArgs e)
        {
            /**/
            /*
         *   OpenWriteCompleted - 在打开用于上传的流完成时(包括取消操作及有错误发生时)所触发的事件
         *   WriteStreamClosed - 在写入数据流的异步操作完成时(包括取消操作及有错误发生时)所触发的事件
         *   UploadProgressChanged - 上传数据过程中所触发的事件。如果调用 OpenWriteAsync() 则不会触发此事件
         *   Headers - 与请求相关的的标头的 key/value 对**
         *   OpenWriteAsync(Uri address, string method, Object userToken) - 打开流以使用指定的方法向指定的 URI 写入数据
         *     Uri address - 接收上传数据的 URI
         *     string method - 所使用的 HTTP 方法(POST 或 GET)
         *     Object userToken - 需要上传的数据流
         */             OpenFileDialog openFileDialog = new OpenFileDialog()
            {  //弹出打开文件对话框要求用户自己选择在本地端打开的图片文件
                Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*",
                Multiselect = false  //不允许多选 
            };             if (openFileDialog.ShowDialog() == true)//.DialogResult.OK)
            {
                //fileinfo = openFileDialog.Files; //取得所选择的文件,其中Name为文件名字段,作为绑定字段显示在前端
                fileinfo = openFileDialog.File;                 if (fileinfo != null)
                {
                    WebClient webclient = new WebClient();                     string uploadFileName = fileinfo.Name.ToString(); //获取所选文件的名字                     #region 把图片上传到服务器上                     Uri upTargetUri = new Uri(String.Format("http://localhost:4528/WebClientUpLoadStreamHandler.ashx?fileName={0}", uploadFileName), UriKind.Absolute); //指定上传地址                     webclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webclient_OpenWriteCompleted);
                    webclient.Headers["Content-Type"] = "multipart/form-data";                     webclient.OpenWriteAsync(upTargetUri, "POST", fileinfo.OpenRead());
                    webclient.WriteStreamClosed += new WriteStreamClosedEventHandler(webclient_WriteStreamClosed);                     #endregion                 }
                else
                {
                    MessageBox.Show("请选取想要上载的图片!!!");
                }
            }         }         void webclient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
        {             //将图片数据流发送到服务器上             // e.UserState - 需要上传的流(客户端流)
            Stream clientStream = e.UserState as Stream;
            // e.Result - 目标地址的流(服务端流)
            Stream serverStream = e.Result;
            byte[] buffer = new byte[4096];
            int readcount = 0;
            // clientStream.Read - 将需要上传的流读取到指定的字节数组中
            while ((readcount = clientStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                // serverStream.Write - 将指定的字节数组写入到目标地址的流
                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.ToString());
            }
            else
            {
                System.Windows.Browser.HtmlPage.Window.Alert("图片上传成功!!!");
            }
        }
        #endregion         private void Button_Click(object sender, RoutedEventArgs e)
        {
            //这种方法搞不定,好像提示跨域操作。
            //提示:错误:Unhandled Error in Silverlight Application 跨线程访问无效。
            //Uri upTargetUri = new Uri(String.Format("http://localhost:4528/download.ashx?filename={0}", "123.jpg"), UriKind.Absolute); //指定上传地址
            //WebRequest request = WebRequest.Create(upTargetUri);
            //request.Method = "GET";
            //request.ContentType = "application/octet-stream";
            //request.BeginGetResponse(new AsyncCallback(RequestReady), request);             //通过调用js代码下载,比较简单。
            System.Windows.Browser.HtmlPage.Window.Eval("window.location.href='http://localhost:4528/download.ashx?filename=123.jpg';");
        }
        void RequestReady(IAsyncResult asyncResult)
        {
            MessageBox.Show("RequestComplete");
        }     }
}

在HCLoad.Web项目下新建WebClientUpLoadStreamHandler.ashx


大气象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.IO;  //因为要用到Stream namespace HCLoad.Web
{
    public class WebClientUpLoadStreamHandler : IHttpHandler
    {         public void ProcessRequest(HttpContext context)
        {
            //获取上传的数据流
            string fileNameStr = context.Request.QueryString["fileName"];
            Stream sr = context.Request.InputStream;
            try
            {
                string filename = "";                 filename = fileNameStr;                 byte[] buffer = new byte[4096];
                int bytesRead = 0;
                //将当前数据流写入服务器端文件夹ClientBin下
                string targetPath = context.Server.MapPath("Pics/" + filename + ".jpg");
                using (FileStream fs = File.Create(targetPath, 4096))
                {
                    while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        //向文件中写信息
                        fs.Write(buffer, 0, bytesRead);
                    }
                }                 context.Response.ContentType = "text/plain";
                context.Response.Write("上传成功");
            }
            catch (Exception e)
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write("上传失败, 错误信息:" + e.Message);
            }
            finally
            { sr.Dispose(); }         }         public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    } }

新建download.ashx


大气象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Net; namespace HCLoad.Web
{
    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    public class download : IHttpHandler
    {
        private long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力         public void ProcessRequest(HttpContext context)
        {
            //string fileName = "123.jpg";//客户端保存的文件名
            String fileName = context.Request.QueryString["filename"]; 
            string filePath = context.Server.MapPath("Bubble.jpg");
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
            if (fileInfo.Exists == true)
            {
                byte[] buffer = new byte[ChunkSize];
                context.Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//获得下载文件的总大小
                context.Response.ContentType = "application/octet-stream";
                //通知浏览器下载文件而不是打开
                context.Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
                while (dataLengthToRead > 0 && context.Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
                    context.Response.OutputStream.Write(buffer, 0, lengthRead);
                    context.Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                context.Response.Close();
                context.Response.End();
            }
            //context.Response.ContentType = "text/plain";
            //context.Response.Write("Hello World");
        }         public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

参考:
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/26/1554056.html
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/25/1553534.html
http://www.cnblogs.com/wmt1708/archive/2009/03/07/1405009.html
http://topic.csdn.net/u/20090918/10/5e41ab52-f514-46b5-ae6a-d69ddb197213.html
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/25/1553534.html
http://www.cnblogs.com/gwazy/archive/2009/04/02/1427781.html
http://www.cnblogs.com/ewyb/archive/2009/12/10/1621020.html
http://blog.csdn.net/emily1900/archive/2010/06/08/5655726.aspx

凡事以大气象去面对,优秀是一种习惯。

 
分类: SilverLight
标签: Silverlight

Silverlight结合Web Service进行文件上传的更多相关文章

  1. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  2. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  3. 基于 java 【Web安全】文件上传漏洞及目录遍历攻击

    前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击.本文基于 java 写了一个示例. 原理 在上网的过程中,我们经常会将一些如图片.压缩包之类的文件上传到远端服务器进行保存.文件上传攻击指的是恶 ...

  4. WEB安全:文件上传漏洞

    文件上传漏洞过程 用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力. 一般的情况有: 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行: ...

  5. 构建web应用之——文件上传

    我们通过使用multipart请求数据接收和处理二进制信息(如文件).DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中的multi ...

  6. IIS 之 通过 Web.config 修改文件上传大小限制设置方法

    在IIS 6.0中,不设置默认大小为4M,设置文件上传大小的方法,maxRequestLength(KB),executionTimeout(毫秒),配置如下节点: <system.web> ...

  7. web安全之文件上传漏洞攻击与防范方法

    一. 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效 ...

  8. Web安全-之文件上传漏洞场景

    1   上传漏洞危害介绍 上传是Web中最常见的功能,如果上传功能存在设计.编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可 ...

  9. web实现大文件上传分片上传断点续传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

随机推荐

  1. linux下面MySQL变量修改及生效

    今天在访问mysql项目的时候突然报500错误,没有找到连接,因此想到mysql的连接时间. mysql> show global variables; 主要就是连接时间是28800(8小时), ...

  2. 【Vim命令大全】史上最全的Vim命令

    曾经使用了两年多的Vim,手册也翻过一遍.虽然现在不怎么用vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享. 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器. 虽然 ...

  3. sql 注入 及 in 注入

    原文地址: http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 除了校验参数内容,过滤长度和sql关键字. 解决in条件拼接 ...

  4. Educational Codeforces Round 51 (Rated for Div. 2) The Shortest Statement

    题目链接:The Shortest Statement 今天又在群里看到一个同学问$n$个$n$条边,怎么查询两点直接最短路.看来这种题还挺常见的. 为什么最终答案要从42个点的最短路(到$x,y$) ...

  5. Java并发编程关键字synchronized的总结

    一.对synchronized的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行. ...

  6. java多线程02-----------------synchronized底层实现及JVM对synchronized的优化

    java多线程02-----------------synchronized底层实现及JVM对synchronized的优化 提到java多线程,我们首先想到的就是synchronized关键字,它在 ...

  7. Java中的final关键字(转)

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  8. 【面试 spring】【第七篇】spring的问题

    1.spring你熟悉么?两大特色 spring 主要有IOC和AOP两大特色. =========================================================== ...

  9. Android访问网络数据的几种方式Demo

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看 ...

  10. 自主学习Flappy Bird游戏

    背景 强化学习 MDP基本元素 这部分比较难懂,没有详细看:最优函数值,最优控制等 Q-learning 神经网络 环境搭建 windows下通过pip安装TensorFlow,opencv-pyth ...