WCF上传下载文件
思路:上传时将要上传的文件流提交给服务器端
下载时只需要将服务器上的流返回给客户端即可
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上传下载文件的更多相关文章
- 【WCF】利用WCF实现上传下载文件服务
引言 前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载.出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务. 服务端 1.首先新建一个名 ...
- rz和sz上传下载文件工具lrzsz
######################### rz和sz上传下载文件工具lrzsz ####################################################### ...
- linux上很方便的上传下载文件工具rz和sz
linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- C#实现http协议支持上传下载文件的GET、POST请求
C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...
- HttpClient上传下载文件
HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...
- 初级版python登录验证,上传下载文件加MD5文件校验
服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...
随机推荐
- LeetCode算法题-Find All Anagrams in a String(Java实现)
这是悦乐书的第228次更新,第240篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第95题(顺位题号是438).给定一个字符串s和一个非空字符串p,找到s中p的字谜的所有 ...
- MY Views on Doctor-patient relationship 英语医患关系议论文
MY Views on Doctor-patient relationship Author:Pleiades_Antares(www.cnblogs.com/irischen) 1. In rece ...
- [福大软工] Z班 第7次成绩排行榜
作业要求 http://www.cnblogs.com/easteast/p/7668887.html 评分细则 本次作业评分较为简单,只包含了两个方面的得分,一个是团队任务的计划(10'),一个是采 ...
- JavaScript数据类型之数字类型
引言 JavaScript不区分整数值和浮点数值,全部使用浮点数值表示.当一个数字直接出现在JavaScript程序中,我们称之为数字直接量(numeric litertal).JavaScript支 ...
- MVC四大筛选器—ExceptionFilter
该筛选器是在系统出现异常时触发,可以对抛出的异常进行处理.所有的ExceptionFilter筛选器都是实现自IExceptionFilter接口 public interface IExceptio ...
- 比MR至少快5倍的神器,竟然是它
Hive简介 Hive是一个基于 Hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据.它最初是应Facebook对每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,Hi ...
- MySQL高级知识(六)——索引优化
前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...
- 启动线程用start方法
启动线程用start方法而不是用run方法 public static void main(String[] args) { Thread t=new Thread("Thread-TEST ...
- 提高git下载速度(非代理或修改HOST)
1. 利用开源中国提供的代码仓库 标题已经说的很清楚了,我想对于经常使用git的人来讲,很可能已经知道了.对于新手刚接触git的人来讲,可能你只知道github. 实际上,国内也有很多代码仓库提供方, ...
- SDOI2016 R1做题笔记
SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...