熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

如何通過Web Services上傳和下載文件

2022-06-13   來源: .NET編程 

  隨著Internet技術的發展和跨平台需求的日益增加Web Services的應用越來越廣我們不但需要通過Web Services傳遞字符串信息而且需要傳遞二進制文件信息下面我們就分別介紹如何通過Web Services從服務器下載文件到客戶端和從客戶端通過Web Services上載文件到服務器

  通過Web Services顯示和下載文件

  我們這裡建立的Web Services的名稱為GetBinaryFile提供兩個公共方法分別是GetImage()和GetImageType()前者返回二進制文件字節數組後者返回文件類型其中GetImage()方法有一個參數用來在客戶端選擇要顯示或下載的文件名字這裡我們所顯示和下載的文件可以不在虛擬目錄下采用這個方法的好處是可以根據權限對文件進行顯示和下載控制從下面的方法我們可以看出實際的文件位置並沒有在虛擬目錄下因此可以更好地對文件進行權限控制這在對安全性有比較高的情況下特別有用這個功能在以前的ASP程序中可以用Stream對象實現為了方便讀者進行測試這裡列出了全部的源代碼並在源代碼裡進行介紹和注釋

  首先建立GetBinaryFileasmx文件

  我們可以在VSNET裡新建一個C#的aspxWebCS工程然後添加新項選擇Web服務並設定文件名為GetBinaryFileasmx查看代碼中輸入以下代碼GetBinaryFileasmxcs

  using System;

  using SystemCollections;

  using SystemComponentModel;

  using SystemData;

  using SystemDiagnostics;

  using SystemWeb;

  using SystemWebUI;

  using SystemWebServices;

  using SystemIO;

  namespace aspxWebCS

  {

  ///

  /// GetBinaryFile 的摘要說明

  /// Web Services名稱GetBinaryFile

  /// 功能返回服務器上的一個文件對象的二進制字節數組

  ///

  [WebService(Namespace=

  Description=在Web Services裡利用NET框架進行傳遞二進制文件)]

  public class GetBinaryFile : SystemWebServicesWebService

  {

  #region Component Designer generated code

  //Web 服務設計器所必需的

  private IContainer components = null;

  ///

  /// 清理所有正在使用的資源

  ///

  protected override void Dispose( bool disposing )

  {

  if(disposing &&components != null)

  {

  componentsDispose();

  }

  baseDispose(disposing);

  }

  #endregion

  public class Images: SystemWebServicesWebService

  {

  ///

  /// Web 服務提供的方法返回給定文件的字節數組

  ///

  [WebMethod(Description=Web 服務提供的方法返回給定文件的字節數組)]

  public byte[] GetImage(string requestFileName)

  {

  ///得到服務器端的一個圖片

  ///如果你自己測試注意修改下面的實際物理路徑

  if(requestFileName == null || requestFileName == )

  return getBinaryFile(D:\PictureJPG);

  else

  return getBinaryFile(D:\ + requestFileName);

  }

  ///

  

  /// getBinaryFile返回所給文件路徑的字節數組

  ///

  ///

  public byte[] getBinaryFile(string filename)

  {

  if(FileExists(filename))

  {

  try

  {

  ///打開現有文件以進行讀取

  FileStream s = FileOpenRead(filename);

  return ConvertStreamToByteBuffer(s);

  }

  catch(Exception e)

  {

  return new byte[];

  }

  }

  else

  {

  return new byte[];

  }

  }

  ///

  /// ConvertStreamToByteBuffer把給定的文件流轉換為二進制字節數組

  ///

  ///

  public byte[] ConvertStreamToByteBuffer(SystemIOStream theStream)

  {

  int b;

  SystemIOMemoryStream tempStream = new SystemIOMemoryStream();

  while((b=theStreamReadByte())!=)

  {

  tempStreamWriteByte(((byte)b));

  }

  return tempStreamToArray();

  }

  [WebMethod(Description=Web 服務提供的方法返回給定文件類型)]

  public string GetImageType()

  {

  ///這裡只是測試您可以根據實際的文件類型進行動態輸出

  return image/jpg;

  }

  }

  }

  }

  觀看地址 進入討論組討論

  

  一旦我們創建了上面的asmx文件進行編譯後我們就可以編寫客戶端的代碼來進行調用這個Web Services了

  我們先添加Web引用輸入下面我們編寫顯示文件的中間文件GetBinaryFileShowaspx這裡我們只需要在後代碼裡編寫代碼即可GetBinaryFileShowaspxcs文件內容如下

  using System;

  using SystemCollections;

  using SystemComponentModel;

  using SystemData;

  using SystemDrawing;

  using SystemWeb;

  using SystemWebSessionState;

  using SystemWebUI;

  using SystemWebUIWebControls;

  using SystemWebUIHtmlControls;

  using SystemWebServices;

  namespace aspxWebCS

  {

  ///

  /// GetBinaryFileShow 的摘要說明

  

  ///

  public class GetBinaryFileShow : SystemWebUIPage

  {

  private void Page_Load(object sender SystemEventArgs e)

  {

  // 在此處放置用戶代碼以初始化頁面

  ///定義並初始化文件對象

  aspxWebCSGetBinaryFileImages oImage;

  oImage = new aspxWebCSGetBinaryFileImages();

  ///得到二進制文件字節數組

  byte[] image = oImageGetImage();

  ///轉換為支持存儲區為內存的流

  SystemIOMemoryStream memStream = new SystemIOMemoryStream(image);

  ///定義並實例化Bitmap對象

  Bitmap bm = new Bitmap(memStream);

  ///根據不同的條件進行輸出或者下載

  ResponseClear();

  ///如果請求字符串指定下載就下載該文件

  ///否則就顯示在浏覽器中

  if(RequestQueryString[Download]==)

  {

  ResponseBuffer = true;

  ResponseContentType = application/octetstream;

  ///這裡下載輸出的文件名字 okjpg 為例子你實際中可以根據情況動態決定

  ResponseAddHeader(ContentDispositionattachment;filename=okjpg);

  }

  else

  ResponseContentType = oImageGetImageType();

  ResponseBinaryWrite(image);

  ResponseEnd();

  }

  #region Web Form Designer generated code

  override protected void OnInit(EventArgs e)

  {

  //

  // CODEGEN該調用是 ASPNETWeb 窗體設計器所必需的

  //

  InitializeComponent();

  baseOnInit(e);

  }

  ///

  /// 設計器支持所需的方法 不要使用代碼編輯器修改

  /// 此方法的內容

  ///

  private void InitializeComponent()

  {

  thisLoad += new SystemEventHandler(thisPage_Load);

  }

  #endregion

  }

  }

  最後我們就編寫最終的浏覽頁面GetBinaryFileaspx這個文件很簡單只需要aspx文件即可內容如下

  <%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false"

  Inherits="aspxWebCS.GetBinaryFile" %>  Inherits=aspxWebCSGetBinaryFile %>

  

  

  

  

  

  

  

  

  

  

  

  

  

  runat=server>  runat=server>下載文件

  

  

  

  

  

  收藏地址:進入討論組討論

  

  using System;

  using SystemCollections;

  using SystemComponentModel;

  using SystemData;

  using SystemDiagnostics;

  using SystemWeb;

  using SystemWebServices;

  using SystemIO;

  namespace aspxWebCS

  {

  ///

  /// Upload 的摘要說明

  ///

  [WebService(Namespace=

  Description=在Web Services裡利用NET框架進上載文件)]

  public class Upload : SystemWebServicesWebService

  {

  public Upload()

  {

  //CODEGEN該調用是 ASPNETWeb 服務設計器所必需的

  InitializeComponent();

  }

  #region Component Designer generated code

  //Web 服務設計器所必需的

  private IContainer components = null;

  ///

  /// 設計器支持所需的方法 不要使用代碼編輯器修改

  /// 此方法的內容

  ///

  private void InitializeComponent()

  {

  }

  ///

  /// 清理所有正在使用的資源

  ///

  protected override void Dispose( bool disposing )

  {

  if(disposing &&components != null)

  {

  componentsDispose();

  }

  baseDispose(disposing);

  }

  #endregion

  [WebMethod(Description=Web 服務提供的方法返回是否文件上載成功與否)]

  public string UploadFile(byte[] fsstring FileName)

  {

  try

  {

  ///定義並實例化一個內存流以存放提交上來的字節數組

  MemoryStream m = new MemoryStream(fs);

  ///定義實際文件對象保存上載的文件

  FileStream f = new FileStream(ServerMapPath() + \

  + FileName FileModeCreate);

  ///把內內存裡的數據寫入物理文件

  mWriteTo(f);

  mClose();

  fClose();

  f = null;

  m = null;

  return 文件已經上傳成功;

  }

  catch(Exception ex)

  {

  return exMessage;

  }

  }

  }

  }

  

  using System;

  using SystemCollections;

  using SystemComponentModel;

  using SystemData;

  using SystemDrawing;

  using SystemWeb;

  using SystemWebSessionState;

  using SystemWebUI;

  using SystemWebUIWebControls;

  using SystemWebUIHtmlControls;

  using SystemWebServices;

  using SystemIO;

  namespace aspxWebCS

  {

  ///

  /// Upload 的摘要說明

  /// 利用該方法通過Web Services上載文件

  ///

  public class Upload : SystemWebUIPage

  {

  protected SystemWebUIHtmlControlsHtmlInputFile MyFile;

  protected SystemWebUIWebControlsButton Button;

  private void Page_Load(object sender SystemEventArgs e)

  {

  // 在此處放置用戶代碼以初始化頁面

  }

  #region Web Form Designer generated code

  override protected void OnInit(EventArgs e)

  {

  //

  // CODEGEN該調用是 ASPNETWeb 窗體設計器所必需的

  //

  InitializeComponent();

  baseOnInit(e);

  }

  ///

  /// 設計器支持所需的方法 不要使用代碼編輯器修改

  /// 此方法的內容

  ///

  private void InitializeComponent()

  {

  thisButtonClick += new SystemEventHandler(thisButton_Click);

  thisLoad += new SystemEventHandler(thisPage_Load);

  }

  #endregion

  private void Button_Click(object sender SystemEventArgs e)

  {

  ///首先得到上載文件信息和文件流

  if(MyFilePostedFile != null)

  {

  SystemWebHttpFileCollection oFiles;

  oFiles = SystemWebHttpContextCurrentRequestFiles;

  if(oFilesCount <)

  {

  ResponseWrite (請選擇文件);

  ResponseEnd();

  }

  string FilePath = oFiles[]FileName;

  if(FilePath == || FilePath == null)

  {

  ResponseWrite (請選擇一個文件);

  ResponseEnd();

  }

  

  string FileName = FilePathSubstring(FilePathLastIndexOf(\)+);

  try

  {

  ///處理上載的文件流信息

  byte[] b = new byte[oFiles[]ContentLength];

  SystemIOStream fs;

  aspxWebCSUpload o;

  o = new aspxWebCSUpload();

  fs = (SystemIOStream)oFiles[]InputStream;

  fsRead(b oFiles[]ContentLength);

  ///調用Web Services的UploadFile方法進行上載文件

  ResponseWrite(oUploadFile(b FileName));

  fsClose();

  }

  catch(Exception ex)

  {

  ResponseWrite(exMessage);

  }

  }

  else

  {

  ResponseWrite(請選擇文件);

  }

  }

  }

  }

  

  最後需要注意的是在保存文件時您應該確保指定文件的完整路徑(例如C:MyFilesPicturejpg並確保為 ASPNET使用的帳戶提供要存儲文件的目錄的寫權限上載大文件時可使用 元素的 maxRequestLength 屬性來增加文件大小的最大允許值  其中maxRequestLength指示 ASPNET 支持的HTTP方式上載的最大字節數該限制可用於防止因用戶將大量文件傳遞到該服務器而導致的拒絕服務攻擊指定的大小以 KB 為單位默認值為 KB ( MB)executionTimeout指示在被 ASPNET 自動關閉前允許執行請求的最大秒數在當文件超出指定的大小時如果浏覽器中會產生 DNS錯誤或者出現服務不可得到的情況也請修改以上的配置把配置數加大

  另外上載大文件時還可能會收到以下錯誤信息

  aspnet_wpexe (PID: ) 被回收因為內存消耗超過了 MB(可用 RAM 的百分之

  如果遇到此錯誤信息請增加應用程序的 nfig 文件的 元素中 memoryLimit 屬性的值

  我在自己的機器上測試可以上傳M以上的文件


From:http://tw.wingwit.com/Article/program/net/201311/12410.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.