ASP.NET中常用的文件上传下载方法
ASP.NET中常用的文件上傳下載方法
??? 文件的上傳下載是我們在實際項目開發(fā)過程中經(jīng)常需要用到的技術(shù),這里給出幾種常見的方法,本文主要內(nèi)容包括:1、如何解決文件上傳大小的限制
2、以文件形式保存到服務器
3、轉(zhuǎn)換成二進制字節(jié)流保存到數(shù)據(jù)庫以及下載方法
4、上傳Internet上的資源
第一部分:
??? 首先我們來說一下如何解決ASP.NET中的文件上傳大小限制的問題,我們知道在默認情況下ASP.NET的文件上傳大小限制為2M,一般情況下,我們可以采用更改WEB.Config文件來自定義最大文件大小,如下:
<httpRuntime?executionTimeout="300"?maxRequestLength="40960"?useFullyQualifiedRedirectUrl="false"/> 這樣上傳文件的最大值就變成了4M,但這樣并不能讓我們無限的擴大MaxRequestLength的值,因為ASP.NET會將全部文件載入內(nèi)存后,再加以處理。解決的方法是利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法從IIS為ASP.NET建立的pipe里分塊讀取數(shù)據(jù)。實現(xiàn)方法如下:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
} 這樣就可以解決了大文件的上傳問題了。
第二部分:
??? 下面我們來介紹如何以文件形式將客戶端的一個文件上傳到服務器并返回上傳文件的一些基本信息
首先我們定義一個類,用來存儲上傳的文件的信息(返回時需要)。
public?class?FileUpLoad
{
???public?FileUpLoad()
???{
???}
/**////?<summary>
????????///?上傳文件名稱
????????///?</summary>
????????public?string?FileName
????????{
????????????get
????????????{
????????????????return?fileName;
????????????}
????????????set
????????????{
????????????????fileName?=?value;
????????????}
????????}
????????private?string?fileName;
????????/**////?<summary>
????????///?上傳文件路徑
????????///?</summary>
????????public?string?FilePath
????????{
????????????get
????????????{
????????????????return?filepath;
????????????}
????????????set
????????????{
????????????????filepath?=?value;
????????????}
????????}
????????private?string?filepath;
????????
????????/**////?<summary>
????????///?文件擴展名
????????///?</summary>
????????public?string?FileExtension
????????{
????????????get
????????????{
????????????????return?fileExtension;
????????????}
????????????set
????????????{
????????????
????????????????fileExtension?=?value;
????????????}
????????????????
????????}
????????private?string?fileExtension;
}
另外我們還可以在配置文件中限制上傳文件的格式(App.Config):
<Application>????
????<FileUpLoad>
???????<Format>.jpg|.gif|.png|.bmp</Format>
????</FileUpLoad>
</Application>
這樣我們就可以開始寫我們的上傳文件的方法了,如下:
public?FileUpLoad?UpLoadFile(HtmlInputFile?InputFile,string?filePath,string?myfileName,bool?isRandom)
????????{
????????????
????????????FileUpLoad?fp?=?new?FileUpLoad();
????????????string?fileName,fileExtension;
????????????string?saveName;
????????????
????????????//
????????????//建立上傳對象
????????????//
????????????HttpPostedFile?postedFile?=?InputFile.PostedFile;
????????????fileName????????=?System.IO.Path.GetFileName(postedFile.FileName);
????????????fileExtension????=?System.IO.Path.GetExtension(fileName);
????????????
????????????//
????????????//根據(jù)類型確定文件格式
????????????//
????????????AppConfig?app?=?new?AppConfig();
????????????string?format?=?app.GetPath("FileUpLoad/Format");
????????????//
????????????//如果格式都不符合則返回
????????????//
????????????if(format.IndexOf(fileExtension)==-1)
????????????{
????????????????throw?new?ApplicationException("上傳數(shù)據(jù)格式不合法");
????????????}
????????????????
????????????//
????????????//根據(jù)日期和隨機數(shù)生成隨機的文件名
????????????//
????????????if(myfileName?!=?string.Empty)
????????????{
????????????????fileName?=?myfileName;????????????
????????????}
????????????if(isRandom)
????????????{
????????????????Random?objRand?=?new?Random();
????????????????System.DateTime?date?=?DateTime.Now;
????????????????//生成隨機文件名
????????????????saveName?=?date.Year.ToString()?+?date.Month.ToString()?+?date.Day.ToString()?+?date.Hour.ToString()?+?date.Minute.ToString()?
????????????????????+?date.Second.ToString()?+?Convert.ToString(objRand.Next(99)*97?+?100);
????????????????fileName?=?saveName?+?fileExtension;
????????????}
????????????
????????????string?phyPath?=?HttpContext.Current.Request.MapPath(filePath);
????????????//判斷路徑是否存在,若不存在則創(chuàng)建路徑
????????????DirectoryInfo?upDir?=?new?DirectoryInfo(phyPath);
????????????if(!upDir.Exists)
????????????{
????????????????upDir.Create();
????????????}
????????????//
????????????//保存文件
????????????//
????????????try
????????????{
????????????????postedFile.SaveAs(phyPath?+?fileName);
????????????????fp.FilePath?=??filePath??+?fileName;
????????????????fp.FileExtension?=?fileExtension;
????????????????fp.FileName?=?fileName;
????????????}
????????????catch
????????????{
????????????????throw?new?ApplicationException("上傳失敗!");
????????????}
????????????//返回上傳文件的信息
????????????return?fp;
????????
????????
????????}
然后我們在上傳文件的時候就可以調(diào)用這個方法了,將返回的文件信息保存到數(shù)據(jù)庫中,至于下載,就直接打開那個路徑就OK了。
第三部分:
??? 這里我們主要說一下如何以二進制的形式上傳文件以及下載。首先說上傳,方法如下:
{
?????????//獲取由客戶端指定的上傳文件的訪問
?????????HttpPostedFile?upFile=f_IFile.PostedFile;
?????????//得到上傳文件的長度
????????????????int?upFileLength=upFile.ContentLength;?
?????????//得到上傳文件的客戶端MIME類型
????????????????string?contentType?=?upFile.ContentType;
????????????????byte[]?FileArray=new?Byte[upFileLength];
?
????????????????Stream?fileStream=upFile.InputStream;?
????????????????
????????????????fileStream.Read(FileArray,0,upFileLength);
????????
????????return?FileArray;
}
這個方法返回的就是上傳的文件的二進制字節(jié)流,這樣我們就可以將它保存到數(shù)據(jù)庫了。下面說一下這種形式的下載,也許你會想到這種方式的下載就是新建一個aspx頁面,然后在它的Page_Load()事件里取出二進制字節(jié)流,然后再讀出來就可以了,其實這種方法是不可取的,在實際的運用中也許會出現(xiàn)無法打開某站點的錯誤,我一般采用下面的方法:
首先,在Web.config中加入:
<add?verb="*"?path="openfile.aspx"?type="RuixinOA.Web.BaseClass.OpenFile,?RuixinOA.Web"/>
這表示我打開openfile.aspx這個頁面時,系統(tǒng)就會自動轉(zhuǎn)到執(zhí)行RuixinOA.Web.BaseClass.OpenFile 這個類里的方法,具體實現(xiàn)如下:
using?System;
using?System.Data;
using?System.Web;
using?System.IO;
using?Ruixin.WorkFlowDB;
using?RXSuite.Base;
using?RXSuite.Component;
using?RuixinOA.BusinessFacade;
namespace?RuixinOA.Web.BaseClass
{
????/**////?<summary>
????///?NetUFile?的摘要說明。
????///?</summary>
????public?class?OpenFile?:?IHttpHandler
????{
????????public?void?ProcessRequest(HttpContext?context)?
????????{
????????????
????????????//從數(shù)據(jù)庫中取出要下載的文件信息
????????????RuixinOA.BusinessFacade.RX_OA_FileManager?os?=?new?RX_OA_FileManager();
????????????EntityData?data?=?os.GetFileDetail(id);
????????????if(data?!=?null?&&?data.Tables["RX_OA_File"].Rows.Count?>?0)
????????????{
????????????????DataRow?dr?=?(DataRow)data.Tables["RX_OA_File"].Rows[0];
????????????????context.Response.Buffer?=?true;
????????????????context.Response.Clear();
????????????????context.Response.ContentType?=?dr["CContentType"].ToString();?
????????????????context.Response.AddHeader("Content-Disposition","attachment;filename="?+?HttpUtility.UrlEncode(dr["CTitle"].ToString()));
????????????????context.Response.BinaryWrite((Byte[])dr["CContent"]);
????????????????context.Response.Flush();
????????????????context.Response.End();
????????????}
????????????????????????
????????}
????????public?bool?IsReusable?
????????{?
????????????get?{?return?true;}?
????????}
????}
}
執(zhí)行上面的方法后,系統(tǒng)會提示用戶選擇直接打開還是下載。這一部分我們就說到這里。
第四部分:
??? 這一部分主要說如何上傳一個Internet上的資源到服務器。前面我們有一篇文章詳細介紹了使用方法,這里我不再多說。
請參考:將動態(tài)頁面轉(zhuǎn)化成二進制字節(jié)流
第五部分:總結(jié)
??? 今天簡單的介紹了幾種文件上傳與下載的方法,都是在實際的項目開發(fā)中經(jīng)常需要用到的,可能還有不完善的地方,希望大家可以互相交流一下項目開發(fā)中的經(jīng)驗。寫的不好的地方,請指正,謝謝!
Email:pwei013@163.com
posted on 2006-05-24 22:48 Daniel Pang 閱讀(4842) 評論(19) ?編輯?收藏 引用 網(wǎng)摘 所屬分類: ASP.NET1.1
評論
?re: ASP.NET中文件上傳下載方法集合 2006-05-25 09:54
不錯。特別是第三部分的下載,特別感謝。???? ??
?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:19
學習
???? ??
?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:26
這也叫集合,拉到。???? ??
?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:31
謝謝了,寫得很實用???? ??
?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:35
@Ivan,靜思已過,onekey
不客氣,還有不完善的地方,我陸續(xù)加上
???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-05-25 10:39
@iamsunrise
多謝提醒,名稱已改,:)???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-05-25 11:06
能不能詳細說一下如何作用:隱含的HttpWorkerRequest
和你上傳的時候,怎么關(guān)聯(lián)。
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-05-25 11:14
@tianjj
我一般就通過修改配置文件來改上傳文件的大小,基本上也夠用了.
這種方法具體我還沒試過,回去研究下,再發(fā)上來.:-)???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-05-25 11:18
@tianjj
這個其實就是一個HttpHandler模塊.???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-05-25 11:20
@fuyude.net
呵呵,多謝提醒了???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-06-06 00:32
EntityData data = os.GetFileDetail(id);
請問id 用什么方法傳達進去的?
???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-06-06 08:36
@htusoft
這句只是說明一下得到要下載文件的明細,可以替換成自己的方法,例子中用的是WebSharp框架???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-07-08 18:01
我就是想知道,如果我?guī)б粋€參數(shù)openfile.aspx?id=0001,
怎樣把這個參數(shù)傳入OpenFile 類,用QueryString可以嗎?
應該不可以吧,因為OpenFile 類不是從openfile.aspx的page基類繼承而來。???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-07-08 19:52
@htusoft
可以用QueryString傳值???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-07-08 19:54
不過我的OpenFile類是繼承IHttpHandler的,這樣就可以了???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-07-08 22:00
這樣也會顯示一個Openfile.aspx頁面。可不可以不讓它顯示???? ??
?re: ASP.NET中常用的文件上傳下載方法 2006-07-09 15:34
@htusoft
這個我不清楚,這應該是比較好的一種方法了???? ??
?re: ASP.NET中常用的文件上傳下載方法 2007-01-12 15:02
我是一名ASP.NET初學都,請問第一部分"上傳文件的限制"中的代碼應加到什么地方?謝謝!???? ??
?re: ASP.NET中常用的文件上傳下載方法 2007-01-12 23:54
@wrx
加到Web.config文件中的System.Web節(jié)下???? ??
轉(zhuǎn)載于:https://www.cnblogs.com/miaomiaoga/archive/2007/03/22/683707.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET中常用的文件上传下载方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是学农业水利工程的,不喜欢喝酒应酬,求
- 下一篇: 扩展和修改 Enterprise Lib