分享WCF文件传输---WCFFileTransfer
前几天分享了分享了WCF聊天程序--WCFChat ,本文和大家一起分享利用WCF实现文件的传输。
程序运行效果:
接收文件端:

发送文件端:连接WCF服务,选择要传输的文件

文件传输成功:

我们会在保存文件的默认路径:C:\Documents and Settings\Administrator\桌面,下看到传输的文件:

代码分析:
这里就不一一的阐述每一句代码的作用了,感兴趣的朋友可以下载,文后会有下载链接。说下值得注意的地方:
前两天有人在百度知道中问能不能把WCF中的契约单独封装到一个类库中,当时感觉多此一举,无意中看到把接口单独分出去,有个很好的应用,就是利用通道实现客户端代理。
ITransfer.cs

Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.Runtime.Serialization;
usingSystem.Threading;
usingSystem.IO;
namespaceFileInterface
{
[ServiceContract]
publicinterfaceITransfer
{
[OperationContract(Action="UploadFile")]
voidTransferFile(FileTransferMessagerequest);//文件传输
}
[MessageContract]
publicclassFileTransferMessage
{
[MessageHeader(MustUnderstand=true)]
publicstringSavePath;//文件保存路径
[MessageHeader(MustUnderstand=true)]
publicstringFileName;//文件名称
[MessageBodyMember(Order=1)]
publicStreamFileData;//文件传输时间
}
}
利用通道创建客户端代理:

Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->if(_proxy==null)
{
try
{
NetTcpBindingbinding=newNetTcpBinding();
binding.TransferMode=TransferMode.Streamed;
binding.SendTimeout=newTimeSpan(0,30,0);
//利用通道创建客户端代理
_proxy=ChannelFactory<ITransfer>.CreateChannel(binding,newEndpointAddress(CBSerURL.Text));
IContextChannelobj=_proxyasIContextChannel;
//strings=obj.SessionId;
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
return;
}这样,既不用添加服务引用,也不需要生成代理。
文件传输的函数不是很难,代码如下:

Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicvoidTransferFile(FileTransferMessagerequest)
{
stringlogInfo;
Program.Get_ILog().Log(logInfo=string.Format("开始接收文件,name={0}",request.FileName));//填写日志
//文件信息
stringuploadFolder=AppValue.GetParam()._saveDir;
stringsavaPath=request.SavePath;
stringfileName=request.FileName;
StreamsourceStream=request.FileData;
FileStreamtargetStream=null;
//判断文件是否可读
if(!sourceStream.CanRead)
{
thrownewException("数据流不可读!");
}
if(savaPath==null)savaPath=@"文件传输\";
if(!savaPath.EndsWith("\\"))savaPath+="\\";
if(!uploadFolder.EndsWith("\\"))uploadFolder+="\\";
uploadFolder=uploadFolder+savaPath;
//创建保存文件夹
if(!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
intfileSize=0;
stringfilePath=Path.Combine(uploadFolder,fileName);//Combine合并两个路径
try
{
//文件流传输
using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))
{
//定义文件缓冲区
constintbufferLen=4096;
byte[]buffer=newbyte[bufferLen];
intcount=0;
while((count=sourceStream.Read(buffer,0,bufferLen))>0)
{
targetStream.Write(buffer,0,count);
fileSize+=count;
}
targetStream.Close();
sourceStream.Close();
}
}
catch(Exceptionex)
{
Program.Get_ILog().Log(logInfo+ex.Message);
}
Program.Get_ILog().Log(string.Format("接收文件完毕name={0},filesize={1}",
request.FileName,fileSize));
}
源代码:
/Files/gaoweipeng/WCFFileTransfer.rar
程序运行效果:
接收文件端:
发送文件端:连接WCF服务,选择要传输的文件
文件传输成功:
我们会在保存文件的默认路径:C:\Documents and Settings\Administrator\桌面,下看到传输的文件:
代码分析:
这里就不一一的阐述每一句代码的作用了,感兴趣的朋友可以下载,文后会有下载链接。说下值得注意的地方:
前两天有人在百度知道中问能不能把WCF中的契约单独封装到一个类库中,当时感觉多此一举,无意中看到把接口单独分出去,有个很好的应用,就是利用通道实现客户端代理。
ITransfer.cs
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.Runtime.Serialization;
usingSystem.Threading;
usingSystem.IO;
namespaceFileInterface
{
[ServiceContract]
publicinterfaceITransfer
{
[OperationContract(Action="UploadFile")]
voidTransferFile(FileTransferMessagerequest);//文件传输
}
[MessageContract]
publicclassFileTransferMessage
{
[MessageHeader(MustUnderstand=true)]
publicstringSavePath;//文件保存路径
[MessageHeader(MustUnderstand=true)]
publicstringFileName;//文件名称
[MessageBodyMember(Order=1)]
publicStreamFileData;//文件传输时间
}
}
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->if(_proxy==null)
{
try
{
NetTcpBindingbinding=newNetTcpBinding();
binding.TransferMode=TransferMode.Streamed;
binding.SendTimeout=newTimeSpan(0,30,0);
//利用通道创建客户端代理
_proxy=ChannelFactory<ITransfer>.CreateChannel(binding,newEndpointAddress(CBSerURL.Text));
IContextChannelobj=_proxyasIContextChannel;
//strings=obj.SessionId;
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
return;
}
文件传输的函数不是很难,代码如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicvoidTransferFile(FileTransferMessagerequest)
{
stringlogInfo;
Program.Get_ILog().Log(logInfo=string.Format("开始接收文件,name={0}",request.FileName));//填写日志
//文件信息
stringuploadFolder=AppValue.GetParam()._saveDir;
stringsavaPath=request.SavePath;
stringfileName=request.FileName;
StreamsourceStream=request.FileData;
FileStreamtargetStream=null;
//判断文件是否可读
if(!sourceStream.CanRead)
{
thrownewException("数据流不可读!");
}
if(savaPath==null)savaPath=@"文件传输\";
if(!savaPath.EndsWith("\\"))savaPath+="\\";
if(!uploadFolder.EndsWith("\\"))uploadFolder+="\\";
uploadFolder=uploadFolder+savaPath;
//创建保存文件夹
if(!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
intfileSize=0;
stringfilePath=Path.Combine(uploadFolder,fileName);//Combine合并两个路径
try
{
//文件流传输
using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))
{
//定义文件缓冲区
constintbufferLen=4096;
byte[]buffer=newbyte[bufferLen];
intcount=0;
while((count=sourceStream.Read(buffer,0,bufferLen))>0)
{
targetStream.Write(buffer,0,count);
fileSize+=count;
}
targetStream.Close();
sourceStream.Close();
}
}
catch(Exceptionex)
{
Program.Get_ILog().Log(logInfo+ex.Message);
}
Program.Get_ILog().Log(string.Format("接收文件完毕name={0},filesize={1}",
request.FileName,fileSize));
}
其他的代码感兴趣的朋友下载来研究吧!
源代码:
/Files/gaoweipeng/WCFFileTransfer.rar