隨著Internet技術的發展和跨平臺需求的日益增加 Web Services的應用越來越廣 我們不但需要通過Web Services傳遞字符串信息 而且需要傳遞二進制文件信息 下面 我們就分別介紹如何通過Web Services從服務器下載文件到客戶端和從客戶端通過Web Services上載文件到服務器
壹 通過Web Services顯示和下載文件
我們這裏建立的Web Services的名稱為GetBinaryFile 提供兩個公***方法 分別是GetImage()和GetImageType() 前者返回二進制文件字節數組 後者返回文件類型 其中 GetImage()方法有壹個參數 用來在客戶端選擇要顯示或下載的文件名字 這裏我們所顯示和下載的文件可以不在虛擬目錄下 采用這個方法的好處是 可以根據權限對文件進行顯示和下載控制 從下面的方法我們可以看出 實際的文件位置並沒有在虛擬目錄下 因此可以更好地對文件進行權限控制 這在對安全性有比較高的情況下特別有用 這個功能在以前的ASP程序中可以用Stream對象實現 為了方便讀者進行測試 這裏列出了全部的源代碼 並在源代碼裏進行介紹和註釋
首先 建立GetBinaryFile a *** x文件
我們可以在VS NET裏新建壹個C#的aspxWebCS工程 然後 添加新項 選擇 Web服務 並設定文件名為 GetBinaryFile a *** x 在 查看代碼 中輸入以下代碼 即 GetBinaryFile a *** x cs
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Diagnostics;
using System Web;
using System Web UI;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// GetBinaryFile 的摘要說明
/// Web Services名稱 GetBinaryFile
/// 功能 返回服務器上的壹個文件對象的二進制字節數組
///
[WebService(Namespace=
Description= 在Web Services裏利用 NET框架進行傳遞二進制文件 )]
public class GetBinaryFile : System Web Services WebService
{
#region Component Designer generated code
//Web 服務設計器所必需的
private IContainer ponents = null;
///
/// 清理所有正在使用的資源
///
protected override void Dispose( bool disposing )
{
if(disposing &&ponents != null)
{
ponents Dispose();
}
base Dispose(disposing);
}
#endregion
public class Images: System Web Services WebService
{
///
/// Web 服務提供的方法 返回給定文件的字節數組
///
[WebMethod(Description= Web 服務提供的方法 返回給定文件的字節數組 )]
public byte[] GetImage(string requestFileName)
{
///得到服務器端的壹個圖片
///如果妳自己測試 註意修改下面的實際物理路徑
if(requestFileName == null || requestFileName == )
return getBinaryFile( D:\Picture JPG );
else
return getBinaryFile( D:\ + requestFileName);
}
///
/// getBinaryFile 返回所給文件路徑的字節數組
///
///
public byte[] getBinaryFile(string filename)
{
if(File Exists(filename))
{
try
{
///打開現有文件以進行讀取
FileStream s = File OpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch(Exception e)
{
return new byte[ ];
}
}
else
{
return new byte[ ];
}
}
///
/// ConvertStreamToByteBuffer 把給定的文件流轉換為二進制字節數組
///
///
public byte[] ConvertStreamToByteBuffer(System IO Stream theStream)
{
int b ;
System IO MemoryStream tempStream = new System IO MemoryStream();
while((b =theStream ReadByte())!= )
{
tempStream WriteByte(((byte)b ));
}
return tempStream ToArray();
}
[WebMethod(Description= Web 服務提供的方法 返回給定文件類型 )]
public string GetImageType()
{
///這裏只是測試 您可以根據實際的文件類型進行動態輸出
return image/jpg ;
}
}
}
}
觀看地址 進入討論組討論
壹旦我們創建了上面的a *** x文件 進行編譯後 我們就可以編寫客戶端的代碼來進行調用這個Web Services了
我們先 添加Web引用 輸入 下面 我們編寫顯示文件的中間文件 GetBinaryFileShow aspx 這裏 我們只需要在後代碼裏編寫代碼即可 GetBinaryFileShow aspx cs文件內容如下
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Drawing;
using System Web;
using System Web SessionState;
using System Web UI;
using System Web UI WebControls;
using System Web UI HtmlControls;
using System Web Services;
namespace aspxWebCS
{
///
/// GetBinaryFileShow 的摘要說明
///
public class GetBinaryFileShow : System Web UI Page
{
private void Page_Load(object sender System EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
///定義並初始化文件對象
aspxWebCS GetBinaryFile Images oImage;
oImage = new aspxWebCS GetBinaryFile Images();
///得到二進制文件字節數組
byte[] image = oImage GetImage( );
///轉換為支持存儲區為內存的流
System IO MemoryStream memStream = new System IO MemoryStream(image);
///定義並實例化Bitmap對象
Bitmap bm = new Bitmap(memStream);
///根據不同的條件進行輸出或者下載
Response Clear();
///如果請求字符串指定下載 就下載該文件
///否則 就顯示在瀏覽器中
if(Request QueryString[ Download ]== )
{
Response Buffer = true;
Response ContentType = application/octet stream ;
///這裏下載輸出的文件名字 ok jpg 為例子 妳實際中可以根據情況動態決定
Response AddHeader( Content Disposition attachment;filename=ok jpg );
}
else
Response ContentType = oImage GetImageType();
Response BinaryWrite(image);
Response End();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN 該調用是 ASP NEeb 窗體設計器所必需的
//
InitializeComponent();
base OnInit(e);
}
///
/// 設計器支持所需的方法 不要使用代碼編輯器修改
/// 此方法的內容
///
private void InitializeComponent()
{
this Load += new System EventHandler(this Page_Load);
}
#endregion
}
}
最後 我們就編寫最終的瀏覽頁面 GetBinaryFile aspx 這個文件很簡單 只需要aspx文件即可 內容如下
<%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false"
Inherits="aspxWebCS.GetBinaryFile" %> Inherits= aspxWebCS GetBinaryFile %>
runat= server > runat= server >下載文件
收藏地址:進入討論組討論
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Diagnostics;
using System Web;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// Upload 的摘要說明
///
[WebService(Namespace=
Description= 在Web Services裏利用 NET框架進上載文件 )]
public class Upload : System Web Services WebService
{
public Upload()
{
//CODEGEN 該調用是 ASP NEeb 服務設計器所必需的
InitializeComponent();
}
#region Component Designer generated code
//Web 服務設計器所必需的
private IContainer ponents = null;
///
/// 設計器支持所需的方法 不要使用代碼編輯器修改
/// 此方法的內容
///
private void InitializeComponent()
{
}
///
/// 清理所有正在使用的資源
///
protected override void Dispose( bool disposing )
{
if(disposing &&ponents != null)
{
ponents Dispose();
}
base Dispose(disposing);
}
#endregion
[WebMethod(Description= Web 服務提供的方法 返回是否文件上載成功與否 )]
public string UploadFile(byte[] fs string FileName)
{
try
{
///定義並實例化壹個內存流 以存放提交上來的字節數組
MemoryStream m = new MemoryStream(fs);
///定義實際文件對象 保存上載的文件
FileStream f = new FileStream(Server MapPath( ) + \
+ FileName FileMode Create);
///把內內存裏的數據寫入物理文件
m WriteTo(f);
m Close();
f Close();
f = null;
m = null;
return 文件已經上傳成功 ;
}
catch(Exception ex)
{
return ex Message;
}
}
}
}
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Drawing;
using System Web;
using System Web SessionState;
using System Web UI;
using System Web UI WebControls;
using System Web UI HtmlControls;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// Upload 的摘要說明
/// 利用該方法通過Web Services上載文件
///
public class Upload : System Web UI Page
{
protected System Web UI HtmlControls HtmlInputFile MyFile;
protected System Web UI WebControls Button Button ;
private void Page_Load(object sender System EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN 該調用是 ASP NEeb 窗體設計器所必需的
//
InitializeComponent();
base OnInit(e);
}
///
/// 設計器支持所需的方法 不要使用代碼編輯器修改
/// 此方法的內容
///
private void InitializeComponent()
{
this Button Click += new System EventHandler(this Button _Click);
this Load += new System EventHandler(this Page_Load);
}
#endregion
private void Button _Click(object sender System EventArgs e)
{
///首先得到上載文件信息和文件流
if(MyFile PostedFile != null)
{
System Web HttpFileCollection oFiles;
oFiles = System Web HttpContext Current Request Files;
if(oFiles Count < )
{
Response Write ( 請選擇文件 );
Response End();
}
string FilePath = oFiles[ ] FileName;
if(FilePath == || FilePath == null)
{
Response Write ( 請選擇壹個文件 );
Response End();
}
string FileName = FilePath Substring(FilePath LastIndexOf( \ )+ );
try
{
///處理上載的文件流信息
byte[] b = new byte[oFiles[ ] ContentLength];
System IO Stream fs;
aspxWebCS Upload o;
o = new aspxWebCS Upload();
fs = (System IO Stream)oFiles[ ] InputStream;
fs Read(b oFiles[ ] ContentLength);
///調用Web Services的UploadFile方法進行上載文件
Response Write(o UploadFile(b FileName));
fs Close();
}
catch(Exception ex)
{
Response Write(ex Message);
}
}
else
{
Response Write( 請選擇文件 );
}
}
}
}
最後 需要註意的是 在保存文件時 您應該確保指定文件的完整路徑(例如 C:MyFilesPicture jpg ) 並確保為 ASP NET使用的帳戶提供要存儲文件的目錄的寫權限 上載大文件時 可使用 元素的 maxRequestLength 屬性來增加文件大小的最大允許值 其中 maxRequestLength 指示 ASP NET 支持的HTTP方式上載的最大字節數 該限制可用於防止因用戶將大量文件傳遞到該服務器而導致的拒絕服務攻擊 指定的大小以 KB 為單位 默認值為 KB ( MB) executionTimeout 指示在被 ASP NET 自動關閉前 允許執行請求的最大秒數 在當文件超出指定的大小時 如果瀏覽器中會產生 DNS錯誤或者出現服務不可得到的情況 也請修改以上的配置 把配置數加大
另外 上載大文件時 還可能會收到以下錯誤信息
aspnet_wp exe (PID: ) 被回收 因為內存消耗超過了 MB(可用 RAM 的百分之 )
如果遇到此錯誤信息 請增加應用程序的 nfig 文件的 元素中 memoryLimit 屬性的值
lishixinzhi/Article/program/net/201311/12410