日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET中常用的文件上传下载方法

發(fā)布時(shí)間:2025/5/22 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET中常用的文件上传下载方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ASP.NET中常用的文件上傳下載方法

??? 文件的上傳下載是我們在實(shí)際項(xiàng)目開發(fā)過程中經(jīng)常需要用到的技術(shù),這里給出幾種常見的方法,本文主要內(nèi)容包括:
1、如何解決文件上傳大小的限制
2、以文件形式保存到服務(wù)器
3、轉(zhuǎn)換成二進(jìn)制字節(jié)流保存到數(shù)據(jù)庫以及下載方法
4、上傳Internet上的資源

第一部分:
??? 首先我們來說一下如何解決ASP.NET中的文件上傳大小限制的問題,我們知道在默認(rèn)情況下ASP.NET的文件上傳大小限制為2M,一般情況下,我們可以采用更改WEB.Config文件來自定義最大文件大小,如下:
<httpRuntime?executionTimeout="300"?maxRequestLength="40960"?useFullyQualifiedRedirectUrl="false"/> 這樣上傳文件的最大值就變成了4M,但這樣并不能讓我們無限的擴(kuò)大MaxRequestLength的值,因?yàn)锳SP.NET會(huì)將全部文件載入內(nèi)存后,再加以處理。解決的方法是利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法從IIS為ASP.NET建立的pipe里分塊讀取數(shù)據(jù)。實(shí)現(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)
{
..
}

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

第二部分:
??? 下面我們來介紹如何以文件形式將客戶端的一個(gè)文件上傳到服務(wù)器并返回上傳文件的一些基本信息
首先我們定義一個(gè)類,用來存儲(chǔ)上傳的文件的信息(返回時(shí)需要)。
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>
????????
///?文件擴(kuò)展名
????????
///?</summary>

????????public?string?FileExtension
????????
{
????????????
get
????????????
{
????????????????
return?fileExtension;
????????????}

????????????
set
????????????
{
????????????
????????????????fileExtension?
=?value;
????????????}

????????????????
????????}

????????
private?string?fileExtension;
}

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

<?xml?version="1.0"?encoding="gb2312"??>
<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ù)日期和隨機(jī)數(shù)生成隨機(jī)的文件名
????????????
//
????????????if(myfileName?!=?string.Empty)
????????????
{
????????????????fileName?
=?myfileName;????????????
????????????}


????????????
if(isRandom)
????????????
{
????????????????Random?objRand?
=?new?Random();
????????????????System.DateTime?date?
=?DateTime.Now;
????????????????
//生成隨機(jī)文件名
????????????????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;
????????
????????
????????}

然后我們在上傳文件的時(shí)候就可以調(diào)用這個(gè)方法了,將返回的文件信息保存到數(shù)據(jù)庫中,至于下載,就直接打開那個(gè)路徑就OK了。

第三部分:
??? 這里我們主要說一下如何以二進(jìn)制的形式上傳文件以及下載。首先說上傳,方法如下:

public?byte[]?UpLoadFile(HtmlInputFile?f_IFile)
{
?????????
//獲取由客戶端指定的上傳文件的訪問
?????????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;

}

這個(gè)方法返回的就是上傳的文件的二進(jìn)制字節(jié)流,這樣我們就可以將它保存到數(shù)據(jù)庫了。下面說一下這種形式的下載,也許你會(huì)想到這種方式的下載就是新建一個(gè)aspx頁面,然后在它的Page_Load()事件里取出二進(jìn)制字節(jié)流,然后再讀出來就可以了,其實(shí)這種方法是不可取的,在實(shí)際的運(yùn)用中也許會(huì)出現(xiàn)無法打開某站點(diǎn)的錯(cuò)誤,我一般采用下面的方法:
首先,在Web.config中加入:
<add?verb="*"?path="openfile.aspx"?type="RuixinOA.Web.BaseClass.OpenFile,?RuixinOA.Web"/>
這表示我打開openfile.aspx這個(gè)頁面時(shí),系統(tǒng)就會(huì)自動(dòng)轉(zhuǎn)到執(zhí)行RuixinOA.Web.BaseClass.OpenFile 這個(gè)類里的方法,具體實(shí)現(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)會(huì)提示用戶選擇直接打開還是下載。這一部分我們就說到這里。

第四部分:

??? 這一部分主要說如何上傳一個(gè)Internet上的資源到服務(wù)器。前面我們有一篇文章詳細(xì)介紹了使用方法,這里我不再多說。
請參考:將動(dòng)態(tài)頁面轉(zhuǎn)化成二進(jìn)制字節(jié)流

第五部分:總結(jié)
??? 今天簡單的介紹了幾種文件上傳與下載的方法,都是在實(shí)際的項(xiàng)目開發(fā)中經(jīng)常需要用到的,可能還有不完善的地方,希望大家可以互相交流一下項(xiàng)目開發(fā)中的經(jīng)驗(yàn)。寫的不好的地方,請指正,謝謝!

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

不錯(cuò)。特別是第三部分的下載,特別感謝。???? ??

?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:19

學(xué)習(xí)
???? ??

?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:26

這也叫集合,拉到。???? ??

?re: ASP.NET中文件上傳下載方法集合 2006-05-25 10:31

謝謝了,寫得很實(shí)用???? ??

?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

能不能詳細(xì)說一下如何作用:隱含的HttpWorkerRequest
和你上傳的時(shí)候,怎么關(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
這個(gè)其實(shí)就是一個(gè)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 用什么方法傳達(dá)進(jìn)去的?
???? ??

?re: ASP.NET中常用的文件上傳下載方法 2006-06-06 08:36

@htusoft
這句只是說明一下得到要下載文件的明細(xì),可以替換成自己的方法,例子中用的是WebSharp框架???? ??

?re: ASP.NET中常用的文件上傳下載方法 2006-07-08 18:01

我就是想知道,如果我?guī)б粋€(gè)參數(shù)openfile.aspx?id=0001,
怎樣把這個(gè)參數(shù)傳入OpenFile 類,用QueryString可以嗎?
應(yīng)該不可以吧,因?yàn)镺penFile 類不是從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

這樣也會(huì)顯示一個(gè)Openfile.aspx頁面。可不可以不讓它顯示???? ??

?re: ASP.NET中常用的文件上傳下載方法 2006-07-09 15:34

@htusoft
這個(gè)我不清楚,這應(yīng)該是比較好的一種方法了???? ??

?re: ASP.NET中常用的文件上傳下載方法 2007-01-12 15:02

我是一名ASP.NET初學(xué)都,請問第一部分"上傳文件的限制"中的代碼應(yīng)加到什么地方?謝謝!???? ??

?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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。