思路:上传时将要上传的文件流提交给服务器端

   下载时只需要将服务器上的流返回给客户端即可

1.契约,当需要传递的数量多于一个时就需要通过messagecontract来封装起来

这里分别实现了上传和下载的所有功能,使用流的方式来上传和下载文件

[ServiceContract]
public interface IResource
{
[OperationContract]
void Upload(FileUploadMessage stream); [OperationContract]
Stream Download(string filename);
}
[MessageContract]
public class FileUploadMessage
{
[MessageHeader(MustUnderstand = true)]
public string resourceName;
[MessageBodyMember(Order = )]
public Stream data;
}

2.实现

这里要注意对上传进行了异步的处理

public Stream Download(string filename)
{
return File.OpenRead(filename);
} /// <summary>
/// 上传
/// </summary>
/// <param name="stream"></param>
public void Upload(FileUploadMessage stream)
{
var path = Environment.CurrentDirectory + @"\resource\";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var finalpath = path + DateTime.Now.ToString("yyyyMMddhhmmss") + stream.resourceName.Substring(stream.resourceName.LastIndexOf('\\') + );
//存入数据库
var model = new Model.resourcePath();
model.projectID = stream.projectID;
model.statu = new BLL.ProjectBLL().GetModel(p => p.id == stream.projectID).currentStatuID;
model.filePath = finalpath;
model.uploadPerson = stream.uploadPerson;
new BLL.ResourcePathBLL().Add(model);
using (var file = File.Create(finalpath))
{
const int bufferlen = ;
byte[] buf = new byte[bufferlen];
int count = ;
while((count=stream.data.Read(buf,,bufferlen))>)
{
file.Write(buf,,count);
}
}
}

3.配置

我们需要在配置文件中修改终结点的绑定类型为netTcpBinding类型

然后对上传的数据进行大小的限制,具体内容见下面的配置文件

<service name="Service.Resource" behaviorConfiguration="resourceBehaviors">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8755/Resource/" />
<add baseAddress="net.tcp://localhost:8756/Resource/"/><!-- 注意此处 -->
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址相对于上面提供的基址-->
<endpoint address="" binding="netTcpBinding" <!-- 绑定类型需要修改--> bindingConfiguration="translateBinding"
contract="Service.IResource" name="ResourceService"></endpoint>
<!-- Metadata Endpoints -->
<!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
<endpoint address="mex" binding="mexHttpBinding" contract="Service.IResource" />
</service>
<!--还需要在system.system.serviceModel中添加-->
<bindings>
<netTcpBinding><!--20M-->
<binding name="translateBinding" maxBufferSize="20971520" maxReceivedMessageSize="20971520"
sendTimeout="00:30:00" transferMode="Streamed"></binding>
</netTcpBinding>
</bindings>

客户端引用时也需要进行配置

<netTcpBinding>
<binding name="ResourceService" transferMode="Streamed" maxBufferSize="" maxReceivedMessageSize=""
sendTimeout="00:30:00"/>
</netTcpBinding>

4.添加服务引用

在需要的位置添加上服务引用,添加和使用方式可以看这一篇文章:WCF使用相关

5.前台调用

前台通过服务引用来调用服务,可以在这里看到服务引用怎么调用:WCF使用相关

下载
ResourceService.ResourceClient service = new ResourceService.ResourceClient("ResourceService");
service.Open();
Stream stream=service.Download(textBox1.Text);
if(stream!=null)
{
if (stream.CanRead)
{
using (FileStream fs = new FileStream(System.Environment.CurrentDirectory +
   @"\a.txt", FileMode.Create, FileAccess.Write, FileShare.None))
{
const int bufferLength = ;
byte[] myBuffer = new byte[bufferLength];
int count;
while ((count = stream.Read(myBuffer, , bufferLength)) > )
{
fs.Write(myBuffer, , count);
}
fs.Close();
stream.Close();
}
}
}
service.Close();
上传
var service = new ResourceService.ResourceClient("ResourceService");
service.Open();
service.UploadAsync(textBox1.Text.Trim(), openFileDialog1.OpenFile());
openFileDialog1.OpenFile());
service.Close();

上一篇:WCF使用相关

WCF上传下载文件的更多相关文章

  1. 【WCF】利用WCF实现上传下载文件服务

    引言     前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载.出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务. 服务端 1.首先新建一个名 ...

  2. rz和sz上传下载文件工具lrzsz

    ######################### rz和sz上传下载文件工具lrzsz ####################################################### ...

  3. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

  4. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  5. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  6. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  7. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  8. HttpClient上传下载文件

    HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...

  9. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

随机推荐

  1. es6的正则扩展笔记之修饰符

    es6对于正则表达式添加了 u 修饰符和 y 修饰符. u 修饰符:含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符.    该修饰符不光会正确处理正则表达式,还会正确处 ...

  2. Oauth2.0[笔记]

    背景 如果资源服务器只是提供资源给自己的应用,使用帐号密码做身份认证倒没什么问题,但如果需要提供资源给第三方应用,就会出现第三方应用需要与资源服务器共享身份凭证,这时会出现几个问题: 1.第三方应用需 ...

  3. 属性复制方法,当属性名字不一致时候可以传入匹配的Map

    /** * @param src * @param dest * @param filedMapping the diffrent fieldName mapping,key is src filen ...

  4. 【vue】vue +element 实现批量删除

    相关资料:http://blog.csdn.net/eagle_88/article/details/70238836 作者:smile.轉角 QQ:493177502

  5. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  6. Redis之过期时间

    1.命令介绍 expire key seconds    设置key的有效时间,单位为秒expire命令返回1表示设置成功,返回0表示键不存在或设置失败. ttl keyttl命令返回值是键的剩余时间 ...

  7. 安装NVIDIA

    安装NVIDIA显卡驱动 $ ubuntu-drivers devices; $ sudo apt install nvidia-340 (安装指定版本) 重启系统: $ nvidia-smi (查看 ...

  8. [Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台

    一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品.想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用arduino,不管用什么,都绕不过服务器进行控制,比如yeel ...

  9. 1-STM32带你入坑系列(STM32介绍)

    由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...

  10. 几种content-type提交以及$_POST 和php://input

    在表单提交数据时,需要告诉服务端自己的content-type,好让服务端处理. 默认表单提交是x-www-form-urlencoded,还有一种常见的 multipart/form-data.那这 ...