Wcf 文件上传下载
wcf 文件上传的例子网上很多,我也是借鉴别人的示例。wcf 文件下载的示例网上就很少了,不知道是不是因为两者的处理方式比较类似,别人就没有再上传了。在此本人做下记录备忘。
UploadFile.svc.cs
public class UploadFile : IUploadFile
{
/// <summary>
/// 服务器地图文件保存路径
/// </summary>
private string savePath = @"D:\矿车定位上传地图备份"; /// <summary>
/// 上传文件
/// </summary>
public void UploadFileMethod(FileUploadMessage myFileMessage)
{
if(!Directory.Exists(savePath))//地图存放的默认文件夹是否存在
{
Directory.CreateDirectory(savePath);//不存在则创建
} string fileName = myFileMessage.FileName;//文件名
string fileFullPath = Path.Combine(savePath, fileName);//合并路径生成文件存放路径
Stream sourceStream = myFileMessage.FileData; if (sourceStream == null) { return; }
if (!sourceStream.CanRead) { return; } //创建文件流,读取流中的数据生成文件
using (FileStream fs = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
try
{
const int bufferLength = ;
byte[] myBuffer = new byte[bufferLength];//数据缓冲区
int count;
while ((count = sourceStream.Read(myBuffer, , bufferLength)) > )
{
fs.Write(myBuffer, , count);
}
fs.Close();
sourceStream.Close();
}
catch { return; }
}
} /// <summary>
/// 获取文件列表
/// </summary>
public string[] GetFilesList()
{
if(!Directory.Exists(savePath))//判断文件夹路径是否存在
{
return null;
} DirectoryInfo myDirInfo = new DirectoryInfo(savePath);
FileInfo[] myFileInfoArray = myDirInfo.GetFiles("*.zip");
string[] myFileList = new string[myFileInfoArray.Length];
//文件排序
for (int i = ; i < myFileInfoArray.Length - ;i++ )
{
for (int j = i + ; j < myFileInfoArray.Length; j++)
{
if(myFileInfoArray[i].LastWriteTime > myFileInfoArray[j].LastWriteTime)
{
FileInfo myTempFileInfo = myFileInfoArray[i];
myFileInfoArray[i] = myFileInfoArray[j];
myFileInfoArray[j] = myTempFileInfo;
}
}
} for (int i = ; i < myFileInfoArray.Length; i++)
{
myFileList[i] = myFileInfoArray[i].Name;
} return myFileList;
} /// <summary>
/// 下载地图
/// </summary>
public Stream DownLoadFile(string fileName)
{
string fileFullPath = Path.Combine(savePath, fileName);//服务器文件路径
if(!File.Exists(fileFullPath))//判断文件是否存在
{
return null;
} try
{
Stream myStream = File.OpenRead(fileFullPath);
return myStream;
}
catch { return null; }
}
}
IUploadFile.cs [ServiceContract]
public interface IUploadFile
{
/// <summary>
/// 上传文件
/// </summary>
[OperationContract(Action = "UploadFile", IsOneWay = true)]
void UploadFileMethod(FileUploadMessage myFileMessage); /// <summary>
/// 获取文件列表
/// </summary>
[OperationContract]
string[] GetFilesList(); /// <summary>
/// 下载文件
/// </summary>
[OperationContract]
Stream DownLoadFile(string fileName);
} [MessageContract]
public class FileUploadMessage
{
[MessageHeader(MustUnderstand = true)]
public string FileName; [MessageBodyMember(Order = )]
public Stream FileData;
}
服务器端 web.config 配置文件 <service behaviorConfiguration="TramcarWcfService.UploadFileBehavior"
name="TramcarWcfService.UploadFile">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="UploadFileBinding" contract="TramcarWcfService.IUploadFile">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service> <basicHttpBinding>
<binding name="UploadFileBinding" maxReceivedMessageSize="" maxBufferSize=""
sendTimeout="00:10:00" transferMode="Streamed" messageEncoding="Mtom">
<security mode="None"/>
</binding>
</basicHttpBinding>
客户端上传文件方法 /// <summary>
/// 上传文件
/// </summary>
public void UploadFileMethod(string fileName,string fileFullPath)
{
UploadFile_WcfService.FileUploadMessage myFileMessage = new DataProcess.UploadFile_WcfService.FileUploadMessage();
myFileMessage.FileName = fileName;//文件名
using (FileStream fs = File.OpenRead(fileFullPath))
{
myFileMessage.FileData = fs;
UploadFile_WcfService.IUploadFile myService = myClient.ChannelFactory.CreateChannel();
try
{
myService.UploadFileMethod(myFileMessage);
}
catch { }
//关闭流
fs.Close();
}
}
客户端下载文件方法 isExit = false;//该变量是窗体是否关闭的标志,如果窗体关闭置为true,跳出写文件循环
//下载地图文件保存路径
string saveFilePath = saveFilePathObj.ToString();
//从服务器中获取地图文件流
Stream sourceStream = myUploadFileClass.DownloadFile(fileNameChecked);
if (sourceStream != null)
{
if (sourceStream.CanRead)
{
using (FileStream fs = new FileStream(saveFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
const int bufferLength = ;
byte[] myBuffer = new byte[bufferLength];
int count;
while ((count = sourceStream.Read(myBuffer, , bufferLength)) > )
{
if (isExit == false)
{
fs.Write(myBuffer, , count);
}
else//窗体已经关闭跳出循环
{
break;
}
}
fs.Close();
sourceStream.Close();
}
}
}
上面的配置上传一些比较大的文件应该是没有问题了,如果需要下载大文件还需要在客户端的app.config 中设置如下配置,此处的重点是设置transferMode="Streamed"默认是Buffered
,如果是Buffered是无法设置较大的maxReceivedMessageSize="9223372036854775807"
<basicHttpBinding>
<binding name="BasicHttpBinding_IUploadFile" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="" maxBufferPoolSize="" maxReceivedMessageSize=""
messageEncoding="Mtom" textEncoding="utf-8" transferMode="Streamed"
useDefaultWebProxy="true">
<readerQuotas maxDepth="" maxStringContentLength="" maxArrayLength=""
maxBytesPerRead="" maxNameTableCharCount="" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
Wcf 文件上传下载的更多相关文章
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- ssh框架文件上传下载
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SpringMVC——返回JSON数据&&文件上传下载
--------------------------------------------返回JSON数据------------------------------------------------ ...
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- NetworkComms 文件上传下载和客户端自动升级(非开源)
演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...
随机推荐
- windows socket 网络编程
样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...
- unity3d 血液
这里的人物头像和血条是在3d世界生成的,所以有真正的纵深感和遮挡关系,废话不多说,看我是怎么实现的. 第一步.先在UI Root里制作头像和血条. 这个制作步骤基本和我前面一篇文章介绍头像血条的制作步 ...
- NET Web开发
.NET Web开发初学者必知的四个网站 No.1 W3school 链接: http://www.w3school.com.cn/ 预览: 介绍: 全球最大Web前端技术教程网站.内容涵盖从基础 ...
- 使用Excel快速发送大量的电子邮件
使用Excel快速发送大量的电子邮件.两个步骤: 1. 准备发送数据: a.) 打开Excel,新Book1.xlsx b.) 填写以下内容. 第一列:接受者,第二列:邮件标题,第三列:文,第四列:附 ...
- Nexus入门指南(图文)
Nexus入门指南(图文) 博客分类: Maven JavamavenGoogleApacheTomcat Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven ...
- 使用UpdatePanel控件
使用UpdatePanel控件(二) UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编 ...
- C#函数式程序设计之泛型(下)
C#函数式程序设计之泛型(下) 每当使用泛型类型时,可以通过where字句对泛型添加约束: + 这个例子直观地声明了一个约束:类型T必须与ListItem<string>相匹配.泛型类 ...
- 最小的MVC工程
asp.net mvc笔记一,最小的MVC工程 Asp.net MVC项目默认会引用很多第三方插件,特别是现在的5.0,默认示例项目就几十M,搞得都不知道那些才是MVC必须的,是重点,那些是可有可 ...
- CLR中的垃圾回收机制
CLR中采用代(generation)来作为其垃圾回收的一种机制,其唯一的目的是提升程序的性能.基予代的垃圾回收器有以下假设: ·对象越新,其生存周期越短. ·对象越老,其生存周期越长. ·回收堆的一 ...
- [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]
Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...