silverlight 大对象文件下载

 

这两天被silverlight的文件下载搞死了!~~~网上找的一堆全是通过异步去下载文件流,通过已知的文件在服务器端的地址,但实际项目应用中

出于安全考虑很多中小型文件还是通过大对象存储在数据中的!~~ 下面通过两个例子和大家分享 silverlight的大对象文件下载!~

 

一。直接在silverlight客户端下载文件

 在silverlight客户端提示用户下载文件,采用SaveFileDialog 控件,该控件是先生成文件再往文件中写入文件流,但缺点是SaveFileDialog的

 SafeFileName 是只读的,在弹出来的下载提示框中要求用户输入要保存的文件名,这样的用户体验就非常的不爽了!~

 

代码如下:

                #region silverlight下载代码
                SaveFileDialog sf = new SaveFileDialog();
                sf.SafeFileName

//由于 SafeFileName 是只读的,但要保证用户下下来的文件类型和和原来文件类型是一致,否则文件就不能用

                string extent = Path.GetExtension(Info.AttachFileName);//Info 是一个对象,AttachFileName 是要下载的文件全名,这里是获取原文件的后缀, 用的时候换成自己的存储的文件名,以下出现的 Info 都是我自己用的实体类
                string extension = string.Format("(*{0})|*{1}|所有文件 (*.*)|*.*", extent, extent);
                if (string.IsNullOrEmpty(extent))
                {
                    extension = "Word文件 (*.docx)|*.docx|zip压缩文件 (*.zip)|*.zip|所有文件 (*.*)|*.*";
                }
                sf.DefaultExt = extension;
                sf.Filter = extension;
                sf.FilterIndex = 1;
                if (sf.ShowDialog() != true) return;
                Stream clientStream = sf.OpenFile();
                using (Stream serverStream = new MemoryStream(Info.AttachFile))//Info 是一个对象,AttachFile 是byte[] 类型,是文件字节数组
                {
                    byte[] buffer = new byte[serverStream.Length];
                    serverStream.Read(buffer, 0, buffer.Length);
                    clientStream.Write(buffer, 0, buffer.Length);
                    clientStream.Close();
                }

                #endregion 

 

二。silverlight结合asp.net的文件实现下载

 1.silverlight.xaml代码

<Button Content="下载" Click="FileButtonClick"  x:Name="fileButton"  /> 

 

 2. silverlight.xaml.cs 代码

            var goToPage = HtmlPage.Window.GetProperty("SilverlightFileDownLoad") as ScriptObject;

                if (goToPage != null)
                    goToPage.InvokeSelf(string.Format("SilverlightFile.ashx?id={0}", Info.Id.ToString()));//调用Default.aspx页面的js方法

 

 3.Default.aspx 的JS 函数

     // silverlight调用实现文件下载

        function SilverlightFileDownLoad(message) {
            window.open('SilverlightFileDownLoad/' + message);
        }

 

4.在web网站中添加 SilverlightFileDownLoad/SilverlightFile.ashx 文件

 

     public void ProcessRequest(HttpContext context)

    {
        try
        {

   //获取从silverlight传过来的ID参数

            string idString = context.Request.QueryString["id"];
            if (!string.IsNullOrEmpty(type) && !string.IsNullOrEmpty(idString))
            {
                int id = Convert.ToInt32(idString);
                String fileName = null;
                Stream iStream = null;
                long dataLengthToRead = 0;//获得下载文件的总大小
                #region 从底层查出对象详细

 

                    GroupQuailtyNotice info = _iGroupQuailtyNoticeBLL.GetById(id);
                    fileName = info.AttachFileName;
                    iStream = new MemoryStream(info.AttachFile);//AttachFile 为 byte[] 数组
                    dataLengthToRead = info.AttachFile.Length;

 

                #endregion
                #region 页面输出下载
                if (iStream != null)
                {
                    byte[] buffer = new byte[ChunkSize];
                    context.Response.Clear();
                    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();
                }
                #endregion
            }
        }
        catch (System.Exception ex)
        {
        }
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中的原始安装包文件呢   这种错误会令人抓狂 不过 还是有解决方法的:   打开注册表工具regedit 在“开始 >运行”中执行命令regedit 找到路径 My Computer >   HKEY CLASSES ROOT > INSATLLER > PRODUCTS > {D7314F9862C648A4DB8BE2A5B47BE100} 然后删除它(注意 在删除注册表键值之前 请右键点击要删除的键值 通过导出功能来做备份 一旦删除之后发生问题 可以通过双击之前导出的注册表文件进行恢复) 退出注册表工具   再试试安装silverlight或升级 是否成功了 反正我是成功了 祝你也好运   情况二及解决方法:   如果在使用windows update更新时 发现某个更新总是安装失败 并且错误代码是643 那么通常都是由于该更新所对应的组件损坏 导致该更新无法安装成功 要解决这个问题 通常都需要将该组件卸载之后重新安装来进行修复 如果无法安装的更新是Microsoft Silverlight的更新 首先需要做好准备的是下载独立的Microsoft Silverlight安装包   方法一:下载Windows Installer clean up工具并安装 在开始菜单中打开它并找到与silverlight相关的项目 将其删除 完成后重新启动计算机 再次安装Microsoft Silverlight并尝试更新 ">情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值