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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2025/4/14 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]ASP.NET中常用的文件上传下载方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、如何解決文件上傳大小的限制
2、以文件形式保存到服務器
3、轉換成二進制字節流保存到數據庫以及下載方法
4、上傳Internet上的資源

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

<?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);
????????????
????????????
//
????????????
//根據類型確定文件格式
????????????
//
????????????AppConfig?app?=?new?AppConfig();
????????????
string?format?=?app.GetPath("FileUpLoad/Format");


????????????
//
????????????
//如果格式都不符合則返回
????????????
//
????????????if(format.IndexOf(fileExtension)==-1)
????????????
{
????????????????
throw?new?ApplicationException("上傳數據格式不合法");
????????????}

????????????????
????????????
//
????????????
//根據日期和隨機數生成隨機的文件名
????????????
//
????????????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);


????????????
//判斷路徑是否存在,若不存在則創建路徑
????????????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;
????????
????????
????????}

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

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

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;

}

這個方法返回的就是上傳的文件的二進制字節流,這樣我們就可以將它保存到數據庫了。下面說一下這種形式的下載,也許你會想到這種方式的下載就是新建一個aspx頁面,然后在它的Page_Load()事件里取出二進制字節流,然后再讀出來就可以了,其實這種方法是不可取的,在實際的運用中也許會出現無法打開某站點的錯誤,我一般采用下面的方法:
首先,在Web.config中加入:
<add?verb="*"?path="openfile.aspx"?type="RuixinOA.Web.BaseClass.OpenFile,?RuixinOA.Web"/>
這表示我打開openfile.aspx這個頁面時,系統就會自動轉到執行RuixinOA.Web.BaseClass.OpenFile 這個類里的方法,具體實現如下:
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)?
????????
{
????????????
????????????
//從數據庫中取出要下載的文件信息
????????????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;}?
????????}

????}

}


執行上面的方法后,系統會提示用戶選擇直接打開還是下載。

第四部分:

將動態頁面轉換為二進制流:

由于我們一般的文件上傳都是一個物理上存在的文件,而這里的流程標簽頁面是根據ID號動態生成的,剛開始我用了一個比較笨的方法,思路是:先將這個頁面保存到服務器的硬盤上,然后再上傳到數據庫中。方法實現如下:

?

? HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=upload.doc");
HttpContext.Current.Response.Charset?
="";
HttpContext.Current.Response.ContentEncoding?
=System.Text.Encoding.GetEncoding("utf-8");
HttpContext.Current.Response.ContentType?
="application/msword";
pn_upload.Page.EnableViewState?
=false;
System.IO.StringWriter??tw?
=?new?System.IO.StringWriter()?;
System.Web.UI.HtmlTextWriter?hw?
=?new?System.Web.UI.HtmlTextWriter(tw);
pn_upload.RenderControl(hw);
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.End();

這樣頁面就以Word格式保存到計算機上了,然后執行上傳到數據庫的操作,這樣也能實現客戶的需求,但給人的感覺總是怪怪的,肯定是個下下策了。

首先需要引用 System.Net 這個命名空間,然后操作如下:

HttpWebRequest?hwq?=?(HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
HttpWebResponse?hwr?
=?(HttpWebResponse)hwq.GetResponse();
byte[]?bytes?=?new?byte[hwr.ContentLength];
Stream?stream?
=?hwr.GetResponseStream();
stream.Read(bytes,
0,Convert.ToInt32(hwr.ContentLength));
//HttpContext.Current.Response.BinaryWrite(bytes);

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

引自:? http://pw.cnblogs.com/archive/2006/05/24/408427.html

?

轉載于:https://www.cnblogs.com/leeyon/archive/2009/03/16/1413254.html

總結

以上是生活随笔為你收集整理的[转]ASP.NET中常用的文件上传下载方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 最污的网站 | 在线观看国产 | 久久只有这里有精品 | 国产主播在线一区 | 色www亚洲国产张柏芝 | 欧美国产三级 | 男女视频久久 | 巨乳中文字幕 | 天天曰天天| 精品视频久久久久久 | 国产特级视频 | 久久精品一区二区免费播放 | 日韩av福利 | 在线伊人网| 亚洲乱乱 | 午夜伦理影院 | 久久久久99精品成人片毛片 | 日韩亚洲欧美一区二区三区 | 91麻豆影视 | 国产精品久久久久野外 | 日本中文字幕有码 | 天堂伊人网 | 蜜桃成人av | 好吊色视频一区二区三区 | 疯狂做爰高潮videossex | 97播播| 黄色视屏在线播放 | 日韩精品一区二区三区在线观看 | 国模私拍在线观看 | 日韩精品一区二区三 | 欧美日韩在线免费视频 | 涩涩视频在线免费看 | 亚洲系列中文字幕 | 东北少妇bbbb搡bbb搡 | 日韩黄色网络 | 久久久黄色网 | 顶级黑人搡bbw搡bbbb搡 | 亚洲电影影音先锋 | 亚洲精品欧美在线 | 中文字幕在线播放一区二区 | 欧美成人国产精品一区二区 | 欧美国产另类 | 亚州av成人 | 亚洲污片 | 91美女高潮出水 | av片亚洲 | 91理论片| 中文人妻熟妇乱又伦精品 | www日本高清视频 | 高潮爽爆喷水h | 国产三级日本三级在线播放 | 亚洲丝袜一区 | 国产欧美精品区一区二区三区 | 一级黄色大片 | 超能一家人电影免费喜剧在线观看 | www.天堂在线 | 国语av| av成人在线观看 | 免费在线看黄网站 | 精品一区二区三区人妻 | 国产少妇一区二区 | 日韩欧美一区二区在线观看 | 欧美成人hd | 看片网站在线观看 | 欧美xxxxx高潮喷水麻豆 | 国产精品欧美一区喷水 | 国产一区自拍视频 | 欧美日一本| wwwav视频在线观看 | 91日本精品 | 红桃一区二区三区 | 黄网站在线观看视频 | 国产精品系列在线播放 | 麻豆一区在线 | 综合激情网站 | 久久在线视频 | 欧美日韩一区二区在线 | 白白色在线观看 | 欧美福利网站 | 夜av | 久久成人网18网站 | 久久久久久在线观看 | 草莓视频成人在线 | 全黄性性激高免费视频 | 亚洲午夜精品一区二区三区他趣 | 原神淫辱系列同人h | 亚洲无吗视频 | www.精品视频| 无码人妻精品中文字幕 | 黄色三级av | 日韩中文字幕久久 | 在线综合视频 | 97超碰国产精品无码蜜芽 | 日韩亚洲一区二区 | 老司机在线看片 | 亚洲精品一二三四 | 蜜臀久久99精品久久久久久 | 外国电影免费观看高清完整版 | 丝袜诱惑一区二区 |