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 许可:购 ...
随机推荐
- AngularJS应用开发思维之1:声明式界面
这篇博客之前承接上一篇:http://www.cnblogs.com/xuema/p/4335180.html 重写示例:模板.指令和视图 AngularJS最显著的特点是用静态的HTML文档,就可以 ...
- Android 2.3 版本中链接边框问题解决
在做移动互联网开发的过程中,同样需要考虑到移动终端(如手机.平板)的不同版本浏览器兼容问题,在Android 2.3 版本的默认浏览器中有一个bug-会自动给所有链接文本在点击操作过程中加黄色或绿色边 ...
- CRUD功能的JqGrid表格
CRUD功能的JqGrid表格 之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作 ...
- 真懂JavaScript吗
你真懂JavaScript http://www.cnblogs.com/elegance/p/4195593.html 看了汤姆大叔的“你真懂JavaScript吗?”,里面有5道题目,我都一一作了 ...
- jQuery EasyUI API - Layout - Layout[原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...
- C++在struct与class差异
在C++中,既能够用structkeyword进行类的定义,也能够用classkeyword进行类的定义,那么这两者究竟有什么差别呢? 唯一的一点差别是:struct和class的默认訪问权限不一样. ...
- [译]Java 设计模式之备忘录
(文章翻译来自Java Design Pattern: Memento) memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态. 在将来时空旅行将成为显示 ...
- OpenCV2第一个马拉松8环——画一个柱状图
在包里 灰度直方图 彩色直方图 葵花宝典 直方图的理论还是非常丰富的,应用也非常多,诸如: 直方图均衡化 直方图匹配(meanshift,camshift) 在这里,我先介绍基础.怎样绘制图像的直方图 ...
- Ruby on Rails (ROR)类书籍
Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...
- Hudson+Maven+Svn搭建持续集成环境
Hudson+Maven+Svn搭建持续集成环境 博客分类: 配置管理 mavenSVNTomcat项目管理配置管理 一.所用开发工具 1. Hudson: Hudson 是一种革命性的开放源码 ...