您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎樣實現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配置:
<system.serviceModel> <bindings> <basicHttpBinding> <bindingnamebindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807" messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/> </basicHttpBinding> </bindings> <services> <servicebehaviorConfigurationservicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior" name="UploadWcfService.UpLoadService"> <endpointaddressendpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService"> </endpoint> <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behaviornamebehaviorname="UploadWcfService.UpLoadServiceBehavior"> <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/> <serviceDebugincludeExceptionDetailInFaultsserviceDebugincludeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
看完上述內容,你們對怎樣實現WCF上傳文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。