您的位置:首页 > 其它

WCF教程--使用流Stream进行文件的上传下载

2016-01-28 00:00 357 查看
wpf项目中,区分客户端和服务端,需要2端进行数据同步和文件传输。wcf文件上传的例子网上很多,我也是借鉴别人的示例。wcf文件下载的示例网上就很少了,不知道是不是因为两者的处理方式比较类似,别人就没有再上传了。WCF支持传送二进制流数据,但有一定的限制。只有BasicHttpBinding、WebHttpBinding、NetTcpBinding和NetNamedPipeBinding支持传送流数据。流数据类型必须是可序列化的Stream或MemoryStream。传递时消息体(MessageBody)中不能包含其他数据。参考:http://www.csharpwin.com/csharpspace/10780r501.shtml1定义接口:
12345678910111213141516171819202122232425262728IUploadFile.cs[ServiceContract]publicinterfaceIUploadFile{///<summary>///上传文件///</summary>[OperationContract(Action="UploadFile",IsOneWay=true)]voidUploadFileMethod(FileUploadMessagemyFileMessage);///<summary>///获取文件列表///</summary>[OperationContract]string[]GetFilesList();///<summary>///下载文件///</summary>[OperationContract]StreamDownLoadFile(stringfileName);}[MessageContract]publicclassFileUploadMessage{[MessageHeader(MustUnderstand=true)]publicstringFileName;[MessageBodyMember(Order=1)]publicStreamFileData;}
2.实现接口:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788UploadFile.svc.cspublicclassUploadFile:IUploadFile{///<summary>///服务器地图文件保存路径///</summary>privatestringsavePath=@"D:\矿车定位上传地图备份";///<summary>///上传文件///</summary>publicvoidUploadFileMethod(FileUploadMessagemyFileMessage){if(!Directory.Exists(savePath))//地图存放的默认文件夹是否存在{Directory.CreateDirectory(savePath);//不存在则创建}stringfileName=myFileMessage.FileName;//文件名stringfileFullPath=Path.Combine(savePath,fileName);//合并路径生成文件存放路径StreamsourceStream=myFileMessage.FileData;if(sourceStream==null){return;}if(!sourceStream.CanRead){return;}//创建文件流,读取流中的数据生成文件using(FileStreamfs=newFileStream(fileFullPath,FileMode.Create,FileAccess.Write,FileShare.None)){try{constintbufferLength=4096;byte[]myBuffer=newbyte[bufferLength];//数据缓冲区intcount;while((count=sourceStream.Read(myBuffer,0,bufferLength))>0){fs.Write(myBuffer,0,count);}fs.Close();sourceStream.Close();}catch{return;}}}///<summary>///获取文件列表///</summary>publicstring[]GetFilesList(){if(!Directory.Exists(savePath))//判断文件夹路径是否存在{returnnull;}DirectoryInfomyDirInfo=newDirectoryInfo(savePath);FileInfo[]myFileInfoArray=myDirInfo.GetFiles("*.zip");string[]myFileList=newstring[myFileInfoArray.Length];//文件排序for(inti=0;i<myFileInfoArray.Length-1;i++){for(intj=i+1;j<myFileInfoArray.Length;j++){if(myFileInfoArray[i].LastWriteTime>myFileInfoArray[j].LastWriteTime){FileInfomyTempFileInfo=myFileInfoArray[i];myFileInfoArray[i]=myFileInfoArray[j];myFileInfoArray[j]=myTempFileInfo;}}}for(inti=0;i<myFileInfoArray.Length;i++){myFileList[i]=myFileInfoArray[i].Name;}returnmyFileList;}///<summary>///下载地图///</summary>publicStreamDownLoadFile(stringfileName){stringfileFullPath=Path.Combine(savePath,fileName);//服务器文件路径if(!File.Exists(fileFullPath))//判断文件是否存在{returnnull;}try{StreammyStream=File.OpenRead(fileFullPath);returnmyStream;}catch{returnnull;}}}
3.配置上传文件大小限制:4.客户端上传文件方法:
123456789101112131415161718192021客户端上传文件方法///<summary>///上传文件///</summary>publicvoidUploadFileMethod(stringfileName,stringfileFullPath){UploadFile_WcfService.FileUploadMessagemyFileMessage=newDataProcess.UploadFile_WcfService.FileUploadMessage();myFileMessage.FileName=fileName;//文件名using(FileStreamfs=File.OpenRead(fileFullPath)){myFileMessage.FileData=fs;UploadFile_WcfService.IUploadFilemyService=myClient.ChannelFactory.CreateChannel();try{myService.UploadFileMethod(myFileMessage);}catch{}//关闭流fs.Close();}}
客户端下载方法:
12345678910111213141516171819202122232425262728293031客户端下载文件方法isExit=false;//该变量是窗体是否关闭的标志,如果窗体关闭置为true,跳出写文件循环//下载地图文件保存路径stringsaveFilePath=saveFilePathObj.ToString();//从服务器中获取地图文件流StreamsourceStream=myUploadFileClass.DownloadFile(fileNameChecked);if(sourceStream!=null){if(sourceStream.CanRead){using(FileStreamfs=newFileStream(saveFilePath,FileMode.Create,FileAccess.Write,FileShare.None)){constintbufferLength=4096;byte[]myBuffer=newbyte[bufferLength];intcount;while((count=sourceStream.Read(myBuffer,0,bufferLength))>0){if(isExit==false){fs.Write(myBuffer,0,count);}else//窗体已经关闭跳出循环{break;}}fs.Close();sourceStream.Close();}}}
上面的配置上传一些比较大的文件应该是没有问题了,如果需要下载大文件还需要在客户端的app.config中设置如下配置,此处的重点是设置transferMode="Streamed"默认是Buffered,如果是Buffered是无法设置较大的maxReceivedMessageSize="9223372036854775807"
1234567891011121314151617181920<behaviors><serviceBehaviors><behaviorname="DefaultBehavior"><serviceDe<ahref="http://www.suchso.com/programmer/chengxuyuan-duanzi-bug-shangwang.html"class="keylink"title="Bug修复"target="_blank">bug</a>includeExceptionDetailInFaults="true"/><serviceMetadatahttpGetEnabled="true"httpGetUrl="http://192.168.20.94:8091/SyncDataService/mex"/></behavior></serviceBehaviors></behaviors><bindings><netTcpBinding><bindingname="TcpBindingConfig"maxBufferPoolSize="524288000"maxBufferSize="65536000"maxReceivedMessageSize="65536000"transferMode="Streamed"><securitymode="None"/></binding></netTcpBinding><basicHttpBinding><bindingname="BasicHttpBindingConfig"maxBufferPoolSize="524288000"maxBufferSize="65536000"maxReceivedMessageSize="65536000"sendTimeout="00:02:00"transferMode="Streamed"><securitymode="None"/></binding></basicHttpBinding></bindings>
原文链接:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: