Silverlight 实现下载文件功能


最近一直在做Siverlight的有关的项目,今天做了一个下载功能,也是经过网上找的各种办法才得到以下的结果,我来总结一下。如果哪有不对的或者哪块有错误的还请各位进行指出来!谢谢!

  在sl中的下载,我认为很难做到像c#中的下载。可以弹出一个对话框进行保存或者另存为的样子。

  下面是通过:WebClientDownHandler文件进行的!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace E9.Server
{
    /// <summary>
    /// Summary description for WebClientDownHandler
    /// </summary>
    public class WebClientDownHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            String fileName = context.Request.QueryString["fileName"]; //客户端保存的文件名
            fileName=HttpUtility.UrlDecode(fileName);
            String filePath = context.Server.MapPath("data/" + fileName); //路径
            FileInfo fileInfo = new FileInfo(filePath);
            if (fileInfo.Exists)
            {
                byte[] buffer = new byte[102400];
                context.Response.Clear();
                FileStream iStream = 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(102400));//'读取的大小
                    context.Response.OutputStream.Write(buffer, 0, lengthRead);
                    context.Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                context.Response.Close();
                context.Response.End();
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

  当我们新建玩这个类的时候,就可以在你点击下载的按钮那里写事件来调用这个类进行下载文件!但是条件是你的文件是存在固定的一个文件夹中的.只有找到路径才可以下载的。

               private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
        {
                       string fileaddressofneeded = “1.txt”;//需要下载的文件名字
            HyperlinkButton hlbutton = sender as HyperlinkButton;
            var client = new WebClient();            
            var u= new Uri(String.Format("{0}/http://www.cnblogs.com/Handler/DownLoadFileHandler.ashx?FileName={1}" ,client.BaseAddress, fileaddressofneeded),UriKind.RelativeOrAbsolute);
            hlbutton.NavigateUri = u;
        }

  在页面上将你的hyperlinkbutton 的属性设置为:_blank 这样就是弹出另一个界面了,所以这样一个简单的下载就可以了,如果谁有新的办法或者好的方法可以拿出来,让大家参考一下!谢谢!

最近一直在做Siverlight的有关的项目,今天做了一个下载功能,也是经过网上找的各种办法才得到以下的结果,我来总结一下。如果哪有不对的或者哪块有错误的还请各位进行指出来!谢谢!

  在sl中的下载,我认为很难做到像c#中的下载。可以弹出一个对话框进行保存或者另存为的样子。

  下面是通过:WebClientDownHandler文件进行的!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace E9.Server
{
    /// <summary>
    /// Summary description for WebClientDownHandler
    /// </summary>
    public class WebClientDownHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            String fileName = context.Request.QueryString["fileName"]; //客户端保存的文件名
            fileName=HttpUtility.UrlDecode(fileName);
            String filePath = context.Server.MapPath("data/" + fileName); //路径
            FileInfo fileInfo = new FileInfo(filePath);
            if (fileInfo.Exists)
            {
                byte[] buffer = new byte[102400];
                context.Response.Clear();
                FileStream iStream = 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(102400));//'读取的大小
                    context.Response.OutputStream.Write(buffer, 0, lengthRead);
                    context.Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                context.Response.Close();
                context.Response.End();
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

  当我们新建玩这个类的时候,就可以在你点击下载的按钮那里写事件来调用这个类进行下载文件!但是条件是你的文件是存在固定的一个文件夹中的.只有找到路径才可以下载的。

               private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
        {
                       string fileaddressofneeded = “1.txt”;//需要下载的文件名字
            HyperlinkButton hlbutton = sender as HyperlinkButton;
            var client = new WebClient();            
            var u= new Uri(String.Format("{0}/http://www.cnblogs.com/Handler/DownLoadFileHandler.ashx?FileName={1}" ,client.BaseAddress, fileaddressofneeded),UriKind.RelativeOrAbsolute);
            hlbutton.NavigateUri = u;
        }

  在页面上将你的hyperlinkbutton 的属性设置为:_blank 这样就是弹出另一个界面了,所以这样一个简单的下载就可以了,如果谁有新的办法或者好的方法可以拿出来,让大家参考一下!谢谢!


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3