WebService思路及功能實現
實現思路:通過添加Web服務來實現
上傳功能實現
一.獲得本地文件並轉化爲字節數組傳入到服務端
private void buttonUpload_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
System.IO.Stream uploadStream = null;
openFileDialog.Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog()==true)
{
fileinfo = openFileDialog.File;
uploadStream = fileinfo.OpenRead();
byte[] buffer = new byte[uploadStream.Length];
//將選擇的文件信息流寫入到字節數組中
uploadStream.Read(buffer, 0, buffer.Length);
if (fileinfo!=null)
{
c.ActionUploadCompleted += new EventHandler<AsyncCompletedEventArgs>(c_ActionUploadCompleted);
c.ActionUploadAsync(fileinfo.Name, buffer, true);
}
}
}
二.服務端捕獲字節數組並還原文件
/// <summary>
/// 上傳功能
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="fileData">字節流</param>
/// <param name="isApplend">是否追加</param>
[WebMethod]
public void ActionUpload(string fileName, byte[] fileData, bool isApplend)
{
if (!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
FileMode fileMode = isApplend ? FileMode.Append : FileMode.Create;
using(FileStream fs=new FileStream(uploadFolder+@"\"+fileName,fileMode,FileAccess.Write))
{
fs.Write(fileData,0,fileData.Length);
}
}
下載功能實現
一.客戶端傳入下載文件名,服務端捕獲文件名並傳回該文件的字節數組
客戶端代碼:
private void buttonBase_Click(object sender, RoutedEventArgs e)
{
UploadFileWebServiceSoapClient c2 = new UploadFileWebServiceSoapClient();
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*";
//給下載文件一個默認的Name
saveDialog.DefaultFileName = "yl";
if (listBox1.SelectedItems.Count < 0)
{
MessageBox.Show("請選擇要下載的下載文件");
}
else if (listBox1.SelectedItems.Count > 1)
{
MessageBox.Show("暫不提供批量下載");
}
else
{
if (saveDialog.ShowDialog()==true)
{
c2.getBinaryFileCompleted += new EventHandler<getBinaryFileCompletedEventArgs>(c2_getBinaryFileCompleted);
c2.getBinaryFileAsync(listBox1.SelectedItem.ToString(),saveDialog);
}
}
}
服務端代碼:
/// <summary>
/// 返回下載文件的字節流,直接返回一個Stream流怎麼老是返回不了呢。悲哀
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
[WebMethod]
public byte[] getBinaryFile(string filename)
{
string downloadsorcepath = uploadFolder + @"\" + filename;
if (File.Exists(downloadsorcepath))
{
try
{
FileStream s2 = File.OpenRead(downloadsorcepath);
byte[] downloadbyte = new byte[s2.Length];
s2.Read(downloadbyte, 0, downloadbyte.Length);
s2.Close();
return downloadbyte;
}
catch (Exception)
{
return new byte[0];
}
}
else
{
return new byte[0];
}
}
二.客戶端捕獲服務端傳回的字節數組,並還原文件保存在本地
void c2_getBinaryFileCompleted(object sender, getBinaryFileCompletedEventArgs e)
{
if (e.Error==null)
{
byte[] mybyte = new byte[e.Result.Length];
mybyte = e.Result;
SaveFileDialog saveDialog = (SaveFileDialog)e.UserState;
using (Stream stream =saveDialog.OpenFile())
{
stream.Write(mybyte, 0, mybyte.Length);
}
}
}