当前位置:主页 > 优乐国际娱乐官网网址正文

优乐国际娱乐官网网址:使用WCF上传文件

05月07日作者:黑曼巴


本文示例源代码或素材下载

在WCF没呈现之前,我不停应用用WebService来上传文件,我不知作别工资什么要这么做,由于我们的文件办事器和网站后台和网站前台都不在同一个机械,操作职员感觉用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService支配在文件办事器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节传布给WebService,然后WebService把这个字撙节保存文件到一个只容许静态页面的网站(静态网站可以防止一些脚本木马)。

WebService来上传文件存在的问题是效率不高,而且不能传输大年夜数据量的文件,当然你可以用Wse中的MTOM来传输大年夜文件,有了WCF就很多多少了,经由过程应用WCF通报Stream工具来通报大年夜数据文件,但有一些限定:

1、只有 BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。

2、 流数据类型必须是可序列化的 Stream 或 MemoryStream。

3、 通报时消息体(Message Body)中不能包孕其他数据。

4、TransferMode的限定和MaxReceivedMessageSize的限定等。

下面详细实现:新建一个WCFService,接口文件的代码如下:

[ServiceContract]

public interface IUpLoadService

{

[OperationContract(Action = "UploadFile", IsOneWay = true)]

void UploadFile(FileUploadMessage request);

}

[MessageContract]

public class FileUploadMessage

{

[Mess优乐国际娱乐官网网址ageHeader(MustUnderstand = true)]

public 优乐国际娱乐官网网址string SavePath;

[MessageHeader(MustUnderstand = true)]

public string FileName;

[MessageBodyMember(Order = 1)]

public Stream FileData;

}

定义FileUploadMessage类的目的是由于第三个限定,要不然文件名和寄放路径就没法子通报给WCF了,根据第二个限定,文件数据是用System.IO.Stream来通报的

接口措施只有一个,便是上传文件,留意措施参数是FileUploadMessage

接口实现类文件的代码如下:

public class UpLoadService : IUpLoadService

{

public void UploadFile(FileUploadMessage request)

{

string uploadFolder = @"C:kkk";

string savaPath = request.SavePat优乐国际娱乐官网网址h;

string dateString = DateTime.Now.ToShortDateString() + @"";

string fileName = request.FileName;

Stream sourceStream = request.FileData;

FileStream targetStream = null;

if (!sourceStream优乐国际娱乐官网网址.CanRead)

{

throw new Exception("数据流弗成读!");

}

if (savaPath == null) savaPath = @"Photo";

if (!savaPath.EndsWith("")) savaPath += "";

uploadFolder = uploadFolder + savaPath + dateString;

if (!Directory.Exists(uploadFolder))

{

Directory.CreateDirectory(uploadFolder);

}

string filePath = Path.Combine(uploadFolder, fileName);

using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))

{

//read from the input stream in 4K chunks

//and save to output stream

const int bufferLen = 4096;

byte[] buffer = new byte[bufferLen];

int count = 0;

while ((count 优乐国际娱乐官网网址= sourceStream.Read(buffer, 0, bufferLen)) > 0)

{

targetStream.Write(buffer, 0, count);

}

targetStream.Close();

sourceStream.Close();

}

}

}

最近关注

热点内容

更多