重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关怎样实现WCF上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联服务项目包括浑南网站建设、浑南网站制作、浑南网页制作以及浑南网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,浑南网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到浑南省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
在优酷上我想上传一段视频,你有想过会台是怎么实现的吗?这里我就为大家分析一下关于利用WCF上传文件,在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节流传给WebService,然后WebService把这个字节流保存文件到一个只允许静态页面的网站(静态网站可以防止一些脚本木马)。
WebService来上传文件存在的问题是效率不高,而且不能传输大数据量的文件,当然你可以用Wse中的MTOM来传输大文件,有了WCF就好多了,通过使用WCF传递Stream对象来传递大数据文件,但有一些限制:只有BasicHttpBinding、NetTcpBinding和NetNamedPipeBinding支持传送流数据。流数据类型必须是可序列化的Stream或MemoryStream。传递时消息体(MessageBody)中不能包含其他数据。TransferMode的限制和MaxReceivedMessageSize的限制等。
下面具体实现:新建一个WCFService,接口文件的代码如下:
[ServiceContract] publicinterfaceIUpLoadService { [OperationContract(Action="UploadFile",IsOneWay=true)] voidUploadFile(FileUploadMessagerequest); } [MessageContract] publicclassFileUploadMessage { [MessageHeader(MustUnderstand=true)] publicstringSavePath; [MessageHeader(MustUnderstand=true)] publicstringFileName; [MessageBodyMember(Order=1)] publicStreamFileData; }
定义FileUploadMessage类的目的是因为第三个限制,要不然文件名和存放路径就没办法传递给WCF了,根据第二个限制,文件数据是用System.IO.Stream来传递的接口方法只有一个,就是WCF上传文件,注意方法参数是FileUploadMessage接口实现类文件的代码如下:
publicclassUpLoadService:IUpLoadService { publicvoidUploadFile(FileUploadMessagerequest) { stringuploadFolder=@"C:\kkk\"; stringsavaPath=request.SavePath; stringdateString=DateTime.Now.ToShortDateString()+@"\"; stringfileName=request.FileName; StreamsourceStream=request.FileData; FileStreamtargetStream=null; if(!sourceStream.CanRead) { thrownewException("数据流不可读!"); } if(savaPath==null)savaPath=@"Photo\"; if(!savaPath.EndsWith("\\"))savaPath+="\\"; uploadFolderuploadFolder=uploadFolder+savaPath+dateString; if(!Directory.Exists(uploadFolder)) { Directory.CreateDirectory(uploadFolder); } stringfilePath=Path.Combine(uploadFolder,fileName); using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None)) { //readfromtheinputstreamin4Kchunks //andsavetooutputstream constintbufferLen=4096; byte[]buffer=newbyte[bufferLen]; intcount=0; while((count=sourceStream.Read(buffer,0,bufferLen))>0) { targetStream.Write(buffer,0,count); } targetStream.Close(); sourceStream.Close(); } } }
实现的功能是到指定目录下按照日期进行目录划分,然后以传过来的文件名保存文件。这篇文章最主要的地方就是下面的Web.Config配置:
看完上述内容,你们对怎样实现WCF上传文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。