跨服務的大文件復制,肯定要和本地大文件復制一樣,分多次傳遞,要不然內存也承受不了,下面就說下如何實現大文件的跨服務復制······
首先肯定要建立一個WCF的服務以及對應的客戶端來測試服務,此方法請參考我的博客:
WCF服務的建立以及調用:http://www.cnblogs.com/sxw117886/p/5629481.html
看了此博客之後大家肯定已經建立了自己的服務以及客戶端了,下面就是見證奇跡的時候了——————大文件復制
-------------------------------------------華麗的分割線---------------------------------------------------------------------------
1.首先我們要編寫WCF代碼(這個代碼是和WCF服務的建立以及調用的代碼放在一起的)
(1)添加一個服務對應的接口CopyFile(Stream stream):如服務 "WCFTestService.DbApiInfo"對應的接口:IApiInfo(就是上面提到的接口名稱要和上面一致)
[ServiceContract]
public interface IApiInfo
{
[OperationContract]
[ServiceKnownType(typeof(string))]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
string CreateApi(Stream name);
[OperationContract]
[ServiceKnownType(typeof(string))]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
void CopyFile(Stream stream);
}
(2)添加接口對應的實現類:DbApiInfo.cs所對應的方法 public void CopyFile(Stream stream)
public class DbApiInfo:IApiInfo
{
public string CreateApi(Stream name)
{
//name.Position = 0;
StreamReader reader = new StreamReader(name);
string text = reader.ReadToEnd();
return "你的名字是:" + text;
}
/// <summary>
/// 復制大文件,每次傳入一定大小的文件流過來,追加到對應的問價裡
/// </summary>
/// <param name="stream"></param>
public void CopyFile(Stream stream)
{
try
{
string FileStr = StreamToString(stream, Encoding.UTF8);
byte[] array = Convert.FromBase64String(FileStr); //把文件信息按照Base64解析成字節格式
//FileMode.Append這個是對大文件的一個追加寫入。這是和本地大文件復制的一個主要區別
using (FileStream fsWrite = new FileStream(@"D:\360安全浏覽器下載\4.avi", FileMode.Append, FileAccess.Write))
{
fsWrite.Write(array, 0, array.Count());//追加寫入文件
}
}
catch (System.Exception ex)
{
}
}
/// <summary>
/// 將請求的流轉化為字符串
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static string StreamToString(Stream stream, Encoding encoding)
{
string result = string.Empty;
try
{
using (StreamReader sr = new StreamReader(stream, encoding))
{
result = sr.ReadToEnd();
sr.Close();
}
}
catch { }
return result;
}
2.添加客戶端的代碼
private void button2_Click(object sender, EventArgs e)
{
//讀取復制文件流
using (FileStream fsRead = new FileStream(@"D:\360安全浏覽器下載\視頻\2.avi", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 2]; //每次讀取2M
//可能文件比較大,要循環讀取,每次讀取2M
while (true)
{
//每次讀取的數據 n:是每次讀取到的實際數據大小
int n = fsRead.Read(buffer, 0, buffer.Count());
//如果n=0說明讀取的數據為空,已經讀取到最後了,跳出循環
if (n == 0)
{
break;
}
string base64buffer = Convert.ToBase64String(buffer);
PostHttp("http://localhost:8888/Service/DbApiInfo/CopyFile", base64buffer);
}
MessageBox.Show("復制完成");
}
}
根據方法可以看到,每次循環會讀取2M的數據流並調用服務端接口傳遞給服務端,這樣大文件局可以分多次傳遞過去,不會對內存產生太大壓力······
最後在啟動服務和客戶端,讓我們見證奇跡:
啟動客戶端時,我們看到界面:

在點擊“大文件復制”按鈕之前,文件加只有一個2.avi視頻文件:

點擊“大文件復制”按鈕之後,界面會彈出“復制成功”界面。

我們再看一下對應的文件夾:

兩個文件出現了·······這就是大文件跨服務的復制方法·······