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>
由于我的wcf是发布的iis上的需要添加下面的节点,用来设置上传文件的限制大小,虽然我上传的文件比较小,我还是想知道上传大文件是怎样配置的。 <system.web><httpRuntime maxRequestLength="2097151" />
客户端上传文件方法

/// <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 文件上传下载的更多相关文章

  1. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  2. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  3. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  4. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  5. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  6. ssh框架文件上传下载

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. SpringMVC——返回JSON数据&&文件上传下载

    --------------------------------------------返回JSON数据------------------------------------------------ ...

  8. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  9. NetworkComms 文件上传下载和客户端自动升级(非开源)

    演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...

随机推荐

  1. Quartz.NET 的任务调度管理工具

    [更新] 基于Quartz.NET 的任务调度管理工具   更新列表: 任务参数可视化. 立即中断正在执行的任务. 每个任务独立的应用程序域 上一版参见: 基于Quqrtz.NET 做的任务调度管理工 ...

  2. 推荐几个靠谱的VPN

    最近开发scala程序使用sbt构建工程时,下载很慢,有些依赖只能通过VPN才能下载下来.在网上搜索了一大堆提供VPN服务的.有一大部分不提供试用,而且还必须得按年购买,看起来是像骗子. 在这里推荐几 ...

  3. Asp.net 4.0,首次请求目录下的文件时响应很慢

    原文:Asp.net 4.0,首次请求目录下的文件时响应很慢 1. 问题起因2. 尝试过的处理思路3. 解决方法 1. 问题起因 一个从VS2003(.Net Framework 1.1)升级到.ne ...

  4. 【C++ Primer】拷贝控制

    十三.复制控制 1. 复制构造函数 类中的成员函数都默觉得inline类型.所以即使在类定义体内的函数声明显示定义为inline类型,在进行函数定义时也可以将inline进行省略. // 复制构造函数 ...

  5. SQL点滴5—产生时间demention,主要是时间转换

    原文:SQL点滴5-产生时间demention,主要是时间转换 数据仓库中有时间表,存储时间信息,这个存储过程接收开始时间结束时间,写入时间具体信息.有高手用excel函数功能很快能产生INSERT语 ...

  6. 编程乐趣:C#获取日期所在周、月份第一和最后一天

    原文:编程乐趣:C#获取日期所在周.月份第一和最后一天 写了个小功能,需要用到以周为时间段,于是写了个获取周第一和最后一天的方法,获取月份的第一和最后一天就比较简单了.代码如下: public cla ...

  7. web中国的数据分析过程

    1 获得web原始数据 2 确定数据编码 例如:是不是url编码或base64编码 3 如果有必要的解码编码 4 确定原始数据和本地字符集显示字符集 5 字符集转换 6 显示 版权声明:本文博客原创文 ...

  8. ReSharper 8.1支持Visual Studio 2013的特色——超强滚动条

    自ReSharper 8.1发布以来,便支持Visual Studio 2013.其中peek功能是它的亮点,滚动条则是它的特色. 接下来小编将展示ReSharper在Visual Studio 20 ...

  9. WEB项目(B/S系统)打包安装(总结篇)

    原文:WEB项目(B/S系统)打包安装(总结篇) 打包安装程序的制作选择性还很多的,有installshield,wise installer,inno setup这几个做打包安装项目都是很强大的,要 ...

  10. Qlik Sense Desktop

    2014年新一代的报表利器 Qlik Sense Desktop 初步体验 2014-09-22 12:45 by BIWORK, 974 阅读, 7 评论, 收藏, 编辑 Qlik Sense De ...