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

ASP.NET中文件上傳下載方法集合

2013-11-13 10:01:48  來源: .NET編程 

  文件的上傳下載是我們在實際項目開發過程中經常需要用到的技術這裡給出幾種常見的方法本文主要內容包括

  如何解決文件上傳大小的限制

  以文件形式保存到服務器

  轉換成二進制字節流保存到數據庫以及下載方法

  上傳Internet上的資源

  第一部分

  首先我們來說一下如何解決中的文件上傳大小限制的問題我們知道在默認情況下ASPNET的文件上傳大小限制為M一般情況下我們可以采用更改WebConfig文件來自定義最大文件大小如下

  這樣上傳文件的最大值就變成了M但這樣並不能讓我們無限的擴大 MaxRequestLength的值因為ASPNET會將全部文件載入內存後再加以處理解決的方法是利用隱含的 HttpWorkerRequest用它的GetPreloadedEntityBody和ReadEntityBody方法從IIS為ASPNET 建立的pipe裡分塊讀取數據實現方法如下

IServiceProvidERProvider=(IServiceProvider)HttpContextCurrent;
HttpWorkerRequestwr=(HttpWorkerRequest)providerGetService(typeof(HttpWorkerRequest));
byte[]bs=wrGetPreloadedEntityBody();

if(!wrIsEntireEntityBodyIsPreloaded())
{
 intn=;
 byte[]bs=newbyte[n];
 while(wrReadEntityBody(bsn)>)
 {
  
 }
}

  這樣就可以解決了大文件的上傳問題了

  第二部分

  下面我們來介紹如何以文件形式將客戶端的一個文件上傳到服務器並返回上傳文件的一些基本信息

  首先我們定義一個類用來存儲上傳的文件的信息(返回時需要)

public class FileUpLoad
{
 public FileUpLoad()
 {}
 /**////


 /// 上傳文件名稱
 ///

 public string FileName
 {
  get
  {
   return fileName;
  }
  set
  {
   fileName = value;
  }
 }
 private string fileName;

 /**////
 /// 上傳文件路徑
 ///

 public string FilePath
 {
  get
  {
   return filepath;
  }
  set
  {
   filepath = value;
  }
 }
 private string filepath;

 /**////
 /// 文件擴展名
 ///

 public string FileExtension
 {
  get
  {
   return fileExtension;
  }
  set
  {
   fileExtension = value;
  }
 }
 private string fileExtension;
}

  另外我們還可以在配置文件中限制上傳文件的格式(AppConfig)

  <?XML version= encoding=gb ?>
<Application>
<FileUpLoad>
<Format>jpg|gif|png|bmp
</FileUpLoad>
</Application>

  這樣我們就可以開始寫我們的上傳文件的方法了如下

public FileUpLoad UpLoadFile(HtmlInputFile InputFilestring filePathstring myfileNamebool isRandom)
{
 FileUpLoad fp = new FileUpLoad();
 string fileNamefileExtension;
 string saveName;

 //
 //建立上傳對象
 //
 HttpPostedFile postedFile = InputFilePostedFile;

 fileName = SystemIOPathGetFileName(postedFileFileName);
 fileExtension = SystemIOPathGetExtension(fileName);

 //
 //根據類型確定文件格式
 //
 AppConfig app = new AppConfig();
 string format = appGetPath(FileUpLoad/Format);

 //
 //如果格式都不符合則返回
 //
 if(formatIndexOf(fileExtension)==)
 {
  throw new ApplicationException(上傳數據格式不合法);
 }

 //
 //根據日期和隨機數生成隨機的文件名
 //
 if(myfileName != stringEmpty)
 {
  fileName = myfileName;
 }

 if(isRandom)
 {
  Random objRand = new Random();
  SystemDateTime date = DateTimeNow;
  //生成隨機文件名
  saveName = dateYearToString() + dateMonthToString() + dateDayToString() + dateHourToString() + dateMinuteToString() + dateSecondToString() + ConvertToString(objRandNext()* + );
  fileName = saveName + fileExtension;
 }

 string phyPath = HttpContextCurrentRequestMapPath(filePath);

 //判斷路徑是否存在若不存在則創建路徑
 DirectoryInfo upDir = new DirectoryInfo(phyPath);
 if(!upDirExists)
 {
  upDirCreate();
 }

 //
 //保存文件
 //
 try
 {
  postedFileSaveAs(phyPath + fileName);

  fpFilePath = filePath + fileName;
  fpFileExtension = fileExtension;
  fpFileName = fileName;
 }
 catch
 {
  throw new ApplicationException(上傳失敗!);
 }

 //返回上傳文件的信息
 return fp;
}

  然後我們在上傳文件的時候就可以調用這個方法了將返回的文件信息保存到數據庫中至於下載就直接打開那個路徑就OK了

  第三部分

  這裡我們主要說一下如何以二進制的形式上傳文件以及下載首先說上傳方法如下

public byte[] UpLoadFile(HtmlInputFile f_IFile)
{
 //獲取由客戶端指定的上傳文件的訪問
 HttpPostedFile upFile=f_IFilePostedFile;
 //得到上傳文件的長度
 int upFileLength=upFileContentLength;
 //得到上傳文件的客戶端MIME類型
 string contentType = upFileContentType;
 byte[] FileArray=new Byte[upFileLength];

 Stream fileStream=upFileInputStream;

 fileStreamRead(FileArrayupFileLength);
 return FileArray;
}

  這個方法返回的就是上傳的文件的二進制字節流這樣我們就可以將它保存到數據庫了下面說一下這種形式的下載也許你會想到這種方式的下載就是新建一個 aspx頁面然後在它的Page_Load()事件裡取出二進制字節流然後再讀出來就可以了其實這種方法是不可取的在實際的運用中也許會出現無法打開某站點的錯誤我一般采用下面的方法

  首先在nfig中加入

<add verb=* path=openfileaspx type=RuixinOAWebBaseClassOpenFile RuixinOAWeb/>

  這表示我打開openfileaspx這個頁面時系統就會自動轉到執行RuixinOAWebBaseClassOpenFile 這個類裡的方法具體實現如下

using System;
using SystemData;
using SystemWeb;
using SystemIO;
using RuixinWorkFlowDB;
using RXSuiteBase;
using RXSuiteComponent;
using RuixinOABusinessFacade;

namespace RuixinOAWebBaseClass
{
 /**////


 /// NetUFile 的摘要說明
 ///

 public class OpenFile : IHttpHandler
 {
  public void ProcessRequest(HttpContext context)
  {
   //從數據庫中取出要下載的文件信息
   RuixinOABusinessFacadeRX_OA_FileManager os = new RX_OA_FileManager();
   EntityData data = osGetFileDetail(id);

   if(data != null && dataTables[RX_OA_File]RowsCount >)
   {
    DataRow dr = (DataRow)dataTables[RX_OA_File]Rows[];
    contextResponseBuffer = true;
    contextResponseClear();
    contextResponseContentType = dr[CContentType]ToString();
    contextResponseAddHeader(ContentDispositionattachment;filename= + HttpUtilityUrlEncode(dr[CTitle]ToString()));
    contextResponseBinaryWrite((Byte[])dr[CContent]);
    contextResponseFlush();
    contextResponseEnd();
   }
  }
  public bool IsReusable
  {  
   get { return true;}
  }
 }
}

  執行上面的方法後系統會提示用戶選擇直接打開還是下載這一部分我們就說到這裡

  第四部分

  這一部分主要說如何上傳一個Internet上的資源到服務器

  首先需要引用 SystemNet 這個命名空間然後操作如下

HttpWebRequest hwq = (HttpWebRequest)WebRequestCreate(x);
HttpWebResponse hwr = (HttpWebResponse)hwqGetResponse();
byte[] bytes = new byte[hwrContentLength];
Stream stream = hwrGetResponseStream();
streamRead(bytesConvertToInt(hwrContentLength));
//HttpContextCurrentResponseBinaryWrite(bytes);

  HttpWebRequest 可以從Internet上讀取文件因此可以很好的解決這個問題

  第五部分總結

  今天簡單的介紹了幾種文件上傳與下載的方法都是在實際的項目開發中經常需要用到的可能還有不完善的地方希望大家可以互相交流一下項目開發中的經驗


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