在优酷上我想上传一段视频,你有想过会台是怎么实现的吗?这里我就为大家分析一下关于利用WCF上传文件,在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节流传给WebService,然后WebService把这个字节流保存文件到一个只允许静态页面的网站(静态网站可以防止一些脚本木马)。
创新互联主要从事网站设计制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务杭锦后,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
#T#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配置:
- <bindingnamebindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807"
- messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/>
- <servicebehaviorConfigurationservicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior"
- name="UploadWcfService.UpLoadService">
- <endpointaddressendpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService">
- <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/>
- <behaviornamebehaviorname="UploadWcfService.UpLoadServiceBehavior">
- <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/>
- <serviceDebugincludeExceptionDetailInFaultsserviceDebugincludeExceptionDetailInFaults="false"/>
新闻名称:手把手教你实现WCF上传文件
浏览地址:http://www.csdahua.cn/qtweb/news19/271069.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网