【分享】 在silverlight中使用wcf上传文件并实时显示进度

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
公司一个项目要用到文件上件, Google后了解到上传一般有三种方式:WebClient、WebService和WCF。

最开始用WebClient.OpenWrite实现了文件上传,但弄不明白怎么才能得到上传进度,只好放弃了。

用WebService还不如直接WCF,参考http://www.cnblogs.com/blackcore/archive/2009/11/21/1607823.html后,自己做了一个,最终的效果图如下:



简单实现步骤如下:

一、在sl.Web项目中添加“启用了 Silverlight 的 WCF 服务”。WCF服务的内容十分简单,只需一个功能:接收字节并储存即可。

        代码如下:

    [ServiceContract(Namespace = "")]
    [SilverlightFaultBehavior]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class UploadFileWCFService
    {
        [OperationContract]
        public void DoWork()
        {
            // 在此处添加操作实现
            return;
        }

        /// <summary>
        /// 开始上传。需要在WCF服务启动文件夹下建立UploadFiles、TempUploadFolder文件夹。
        /// UploadFiles储存上传文件夹
        /// TempUploadFolder为上传临时文件夹
        /// </summary>
        /// <param name="FullPath">保存路径及文件名</param>
        /// <param name="FileContext">文件内容</param>
        /// <param name="Overwrite">是否覆盖</param>
        [OperationContract]
        public void BeginUpload(string FullPath, byte[] FileContext, bool Overwrite)
        {
            try
            {
                if (!FullPath.StartsWith("\\"))
                {
                    FullPath = "\\" + FullPath;
                }           
                string defaultFolder = System.Web.Hosting.HostingEnvironment.MapPath("~/UploadFiles");
                string tempUploadFolder = System.Web.Hosting.HostingEnvironment.MapPath("~/TempUploadFolder");
                string SaveFolder = Path.GetDirectoryName(FullPath);
                string Filename = Path.GetFileName(FullPath);
                string BlockString = Path.GetExtension(Filename);
                string[] block = BlockString.Split('-');
                if (block.Length != 2)
                {
                    throw new Exception("系统不支持此操作");
                }
                int FilesIndex = Convert.ToInt32(block[0].Replace(".", ""));
                int FilesCount = Convert.ToInt32(block[1]);
                string tempFolder = tempUploadFolder + "\\" + Path.GetFileNameWithoutExtension(FullPath); //上传到临时文件夹 

                Directory.CreateDirectory(tempFolder);
                if (!Directory.Exists(defaultFolder + "\\" + SaveFolder))
                {
                    Directory.CreateDirectory(defaultFolder + "\\" + SaveFolder);
                }
                FileMode mode = FileMode.Create;
                if (!Overwrite)
                {
                    mode = FileMode.Append;
                }
                using (FileStream fs = new FileStream(tempFolder + "\\" + Filename, mode, FileAccess.Write))
                {
                    fs.Write(FileContext, 0, FileContext.Length);
                }
                if (FilesIndex == FilesCount - 1)//是否最后一块文件,如是则合并文件块得到完整文件
                {
                    string UploadFile = defaultFolder + "\\" + SaveFolder + "\\" + Path.GetFileNameWithoutExtension(FullPath);
                    string[] files = Directory.GetFiles(tempFolder);
                    using (FileStream sFile = new FileStream(UploadFile, FileMode.Create, FileAccess.Write))
                    {
                        foreach (string file in files)
                        {
                            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
                            {
                                byte[] context = new byte[fs.Length];
                                fs.Read(context, 0, context.Length);
                                sFile.Write(context, 0, context.Length);
                            }
                            File.Delete(file);
                        }
                    }
                    Directory.Delete(tempFolder);
                }
            }
            catch (Exception)
            {
                throw;
       
Silverlight+WCF文件上传,含分段大小调节(WCF 16KB配置)、压缩Buffer调节、速度指示、批量等       近日,随公司的Silverlight项目进展,需要开发文件上传的功能,大致含 文件批量上传、压缩、界面友好 等要求。回想起我在2009年底使用Silverlight 3.0+WCF在VS2008 SP1的环境下开发过文件上传功能,当时就发现在Silverlight端将byte[]数据传递至WCF端时,一旦byte[]大于16KB,WCF端就拒绝接收返回Not Found错误,而且Sil 阅读详情

相关推荐

Silverlight 4企业级开发实战:RIA时代的工程化启示

富互联网应用(RIA)是Web前端演进中的关键阶段,其核心在于突破浏览器沙箱限制,实现高性能、高安全、强交互的企业级体验。Silverlight作为典型RIA技术,依托.NET运行时、硬件加速渲染与WCF RIA Services等机制,解决了HTML5早期难以覆盖的金融交易、离线审批、DRM流媒体等硬核场景。它所代表的非插件技术的成败,而是一种面向真实业务约束的工程思维——如声明式XAML开发、跨平台Portable Library抽象、基于变更集的离线同步、沙箱内建安全模型等。这些实践沉淀为现代前端架

unixboy 439

通过wcf 文件上传,简单上传进度显示

在很多时候,上传文件是经常要用到的,一般我两个方法,一种是通过ashx扩展,另一种说是通过wcf了,本篇只讲述使用后者的实现方法。现实功能:文件上传,简单上传进度显示。1.在asp.net工程里新建项:Silverlight-enabled WCF Service添加一个DoUpload方法: 1: [ServiceContract(Namespace = "")]2: [AspN...

weixin_30443731的博客 289

WCF 远程文件操作进度显示

通过WCF进行远程文件操作,包括上传下载,复制,删除,创建文件夹,删除文件夹,以及上传下载进度显示

Progress Indication while Uploading/Downloading Files using WCFWCF制作带进度条的上传/下载)(转载)...

Download source files - 86.17 KB Introduction This article examines the implementation of upload and download functionality with progress indication (progress bar feature) using the Windows Co...

weixin_34007291的博客 190

Silverlight+WCF文件上传,含分段大小调节(WCF 16KB配置)、压缩Buffer调节、速度指示、批量等...

近日,随公司的Silverlight项目进展,需要开发文件上传的功能,大致含 文件批量上传、压缩、界面友好 等要求。回想起我在2009年底使用Silverlight 3.0+WCF在VS2008 SP1的环境下开发过文件上传功能,当时就发现在Silverlight端将byte[]数据传递至WCF端时,一旦byte[]大于16KB,WCF端就拒绝接收返回Not Found错误,而且Sil...

weixin_30244889的博客 146

分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日)

分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日) 本周Silverlight学习资源更新: [Silverlight入门系列]ListboxItem的IsEnabled属性如何绑定(Silverlight5前夜) Mainz [Silverlight入门系列]如何实现半透明边框的进度提示弹出框 Mainz [Silverl...

weixin_34013044的博客 98

分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月27日-3月4日)

分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月27日-3月4日) 本周Silverlight学习资源更新 Silverlight实用窍门系列:57.Silverlight中的Binding使用(二)-数据验证 程兴亮 企业内部使用Silverlight5浏览器内受信任的应用程序 slmk Silverlig...

web开发自学 126
上一篇: 关于用vs2005/8开发智能设备时出现"未注册平台服务。请修复 visual studio。"的解决办法。
下一篇: EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性
一只熊猫
博客等级 码龄19年 25粉丝 5原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值