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 许可:购 ...
随机推荐
- C语言库函数大全及应用实例七
原文:C语言库函数大全及应用实例七 [编程资料]C语言库函数大全及应用实例七 函数名: getw 功 能: 从流中取一整数 用 法: int getw(FILE *strem); 程序例: #i nc ...
- Windows WDDM显卡驱动框架及GPUView工具的使用(1)
也许这个夏天会写一些东西,这里先说说我做过些什么,知道些什么. 过去的五年里,先后在Vista,Win7和Win8上写过显卡驱动,包括umd和kmd的驱动,积累了大量关于WDDM的经验. 我知道WMM ...
- UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位And ...
- 从一道数学题弹程序员的思维:数学题,求证:(a+b%c)%c=(a+b)%c
在学校论坛看到这道题目,全忘了的感觉. 如果你是高中的,那我觉得你完全没问题.但是,在这个博客园的圈子,觉得全部人都是程(ban)序(zhuan)员(gong)相关的人员,解决这个问题有点难度,毕竟, ...
- windows tcp端口映射或端口转发
windows tcp端口映射或端口转发 windows内部有一个叫netsh的玩意,可以把tcp端口进行映射或转发,可惜不支持udp.举个例子:一台windows有一个80端口,对外可以访问.另有一 ...
- openwrt固件支持3G和4G上网卡
http://wiki.openwrt.org/doc/howtobuild/wireless-router-with-a-3g-dongle Building image with support ...
- .net操作PDF的一些资源(downmoon收集)
因为业务需要,搜集了一些.net操作pdf的一些资源,特在此分享. 1.如何从 Adobe 可移植文档格式 (PDF) 文件中复制文本和图形 http://support.microsoft.com/ ...
- php-fpm介绍及配置
php-fpm是什么 全称是php fastcgi process manager即php fastcgi进程管理器,相比fastcgi静态的唤起cgi,fpm能根据访问的压力动态的唤起cgi进程和销 ...
- WCF服务最近经常死掉
系统上线后WCF服务最近经常死掉的原因分析总结 前言 最近系统上线完修改完各种bug之后,功能上还算是比较稳定,由于最近用户数的增加,不知为何经常出现无法登录.页面出现错误等异常,后来发现是由于W ...
- MD5算法-爬虫学习(五)
在实现爬虫的时候,我们使用Hash结构去存储我们用过的URL的时候,有些URL可能长度很长,为了更加节省空间,我们就要对URL进行压缩,帮它减减肥,这个我们介绍这个MD5算法,可以对URL进行有效的压 ...