功能介绍 主要是使用WCF框架实现从客户端上传图片到服务端并在服务端显示的基本功能 一 首先创建两Windows窗体应用程序 WinFormClient (客户端 发送端)和 WinFormReceiver (接收端) 如图设计FormClient(发送端窗体)的界面 上边是一个panel容器中添加了一个TextBox和 两个Button 下边是一个PictureBox控件(用于浏览上传之前的图片)
然后添加浏览按钮下的后台代码 实现客户端浏览的功能 View Code string fileName = //定义一个全局变量 //浏览选择上传内容 private void btnBrowser_Click(object sender EventArgs e) { //string fileName = //定义一个字段用于获取上传的文件名 OpenFileDialog openFileDialog = new OpenFileDialog() //创建一个OpenFileDialog对象专门用于打开文件 if (openFileDialog ShowDialog() == DialogResult OK)//打开的文件对话框如果选择了OK按钮(确定) 则为真 执行大括号中的内容 { fileName = openFileDialog FileName txtPicName Text = fileName//在textBox中显示文件名 pictureBox Load(fileName) //使该图片在客户端pictuBox中显示 } else return//未选中文件则返回 } 将WinFomClient设为启动项目 运行 当你选择图片后 该图片会显示在发送端的窗体中 供发送者浏览 如需更改上传图片可重新选取 该图片将会被覆盖掉 (上传功能将在下文实现) FormReceiver接收端的窗体只需添加一个PictureBox控件 用于显示客户端上传的图片
二 在解决方案中添加两个类库 ITransferPic(接口) TransferPic(继承接口) 一个控制台应用程序 TransferPicHost(宿主程序) 该实例采用的是 自身托管宿主 并非 IIS宿主 ITransferPic ( ) 添加引用 using System ServiceModel using System IO ( ) 创建一个 ITransferPicService 接口 View Code [ServiceContract] public interface ITransferPicService { [OperationContract]// *** 作契约 Stream GetPic() [OperationContract] void SendPic(Stream transferPic) } TransferPic ( ) 添加引用 using ITransferPic using System IO ( ) 创建一个 TransferPicService 类 继承接口 ITransferPicService 并实现该接口 View Code public class TransferPicService : ITransferPicService { public static Stream PicSource = new MemoryStream() /// <summary> /// 从服务端下载图片到本地 (上传和下载都是拷贝的过程) /// </summary> /// <returns></returns> public Stream GetPic() { MemoryStream ms = new MemoryStream() PicSource Position = //指明从第 位开始拷贝 PicSource CopyTo(ms) //服务端将客户端的Stream复制一份 ms Position = //注意如果缺少该条代码接收端将无法显示上传图片 return ms//然后在返回客户端 } /// <summary> /// 从客户端上传图片到服务端(将客户端的Stream拷贝给服务端的Stream) /// </summary> /// <param name= transferPic ></param> public void SendPic(Stream transferPic) { PicSource Position = transferPic CopyTo(PicSource) } } TransferPicHose 自身托管宿主 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法 可以便于开发者在控制台应用程序 Windows应用程序乃至于ASP NET应用程序中托管服务 不管自宿主的环境是何种应用程序 实质上托管服务的方式都是一致的 如该实例中用到的代码部分 添加引用 using System ServiceModel using ITransferPic using System ServiceModel Description View Code class Program { static void Main(string[] args) { NetTcpBinding bind = new NetTcpBinding() bind MaxBufferSize = bind TransferMode = TransferMode Streamed bind MaxReceivedMessageSize = bind Security Mode = SecurityMode None //超出using 范围程序会自动释放 using (ServiceHost host = new ServiceHost(typeof(TransferPic TransferPicService))) { host AddServiceEndpoint(typeof(ITransferPicService) bind net tcp://localhost: /transferPic ) //该地址为宿主地址 和客户端接收端地址保持一致if (host Description Behaviors Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior() behavior HttpGetEnabled = true behavior HttpGetUrl = new Uri(//localhost: /transferPic/metadata/ ) host Description Behaviors Add(behavior) } host Opened += delegate { Console WriteLine( 图片程序已成功启动! ) } host Open() Console ReadLine() } } } 三 实现上传 WinFormClient 后台上传按钮部分 添加引用 using System IO using System ServiceModel using ITransferPic View Code //执行上传功能 private void btnUpload_Click(object sender EventArgs e) { //pictureBox Load(fileName) //读取流 上传文件流到服务器 FileStream fs = new FileStream(fileName FileMode Open FileAccess Read) //创建一个文件 并把文件放在文件流里边 Stream *** = new MemoryStream() //创建一个滤层流 将文件从第 位拷贝到 *** 中 fs Position = //获取或设置此流的当前位置 fs CopyTo( *** ) //拷贝完成之后进行上传 EndpointAddress epAddr = new EndpointAddress( net tcp://localhost: /transferPic ) //此处也可以用IIS做服务 NetTcpBinding bind = new NetTcpBinding() //绑定方式 bind MaxBufferPoolSize = //最大缓冲 bind TransferMode = TransferMode Streamed//传输模式为流式处理 bind MaxReceivedMessageSize = //定义了服务端接收Message的最大长度 防止文件过大 bind Security Mode = SecurityMode None//安全模式设置为不进行验证 //创建一个工厂 ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr) *** Position = proxy SendPic( *** ) //WCF客户端调用该方法 把客户端 *** 上传到服务端去 } WinFormReceiver 后台 添加引用 using ITransferPic using System IO using System ServiceModel View Code private void FormReceiver_Load(object sender EventArgs e) { Thread myThread = new Thread(ShowPic) //创建一个线程 myThread IsBackground = true//设置后台线程(防止主程序关闭后 仍在运行) myThread Start() //启动线程 } public void ShowPic() { #region 同客户端一样 创建WCF客户端 EndpointAddress epAddr = new EndpointAddress( net tcp://localhost: /transferPic ) NetTcpBinding bind = new NetTcpBinding() bind MaxBufferPoolSize = bind TransferMode = TransferMode Streamed bind MaxReceivedMessageSize = bind Security Mode = SecurityMode None
//创建一个通道 ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr) #endregion while (true) { Stream streamFromServer = proxy GetPic() //返回一个文件流 MemoryStream ms = new MemoryStream() //滤层流拷贝一份 ms Position = streamFromServer CopyTo(ms) //将该文件流拷贝给到ms if (ms Length == ) { System Threading Thread Sleep( ) // 百毫秒执行一次 continue } Bitmap tn = new Bitmap(ms) //创建一个位图 把ms变成图片 pictureBox Image = tn System Threading Thread Sleep( ) // 百毫秒执行一次 Sleep表示当前线程挂起指定的时间 } } 四 运行程序 打开TransferPicHost 文件中bin目录 启动 TransferPicHost exe 此时会d出一个控制台应用程序的窗体 并提示 图片功能已成功启动! 分别启动发送端和接收端项目程序 (将 WinFormClient 或者 WinFormReceiver 设为启动项目 并启动另一个项目文件夹bin目录下的 WinFormReceiver exe 或者 WinFormClient exe ) 点击发送端 浏览按钮 进行选择图片 之后点击 上传按钮 这时 你会发现客户端上传的图片显示在了接收端的窗体上 程序运行成功 lishixinzhi/Article/program/net/201311/12342
应该也是网页最大请求长度的问题。
在Web.config内的<system.web>节中加入
<httpRuntime maxRequestLength="10240000"/>
即可。
自己做个测试吧,我忘了maxRequestLength的值是什么单位了,反正不是B就是KB,好像是KB....:)
网上有许多支持大文件上传的自定义控件,说白了也就是这样做的。
不知道这样能不能给分~~~~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)