亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

asp.net文件上傳方法代碼

2024-04-25 20:31:06
字體:
來源:轉載
供稿:網友

 ASP.NET依托.net framework類庫,封裝了大量的功能,使得上傳文件非常簡單,主要有以下三種基本方法,需要的朋友可以參考下

方法一:用Web控件FileUpload,上傳到網站根目錄。

Test.aspx關鍵代碼:

代碼如下:

<form id="form1" runat="server">
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="上傳" OnClick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="" Style="color: Red"></asp:Label>
</form>


Test.aspx.cs關鍵代碼:

代碼如下:

protected void Button1_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile)
    {
    FileUpload1.SaveAs(Server.MapPath("~/") + FileUpload1.FileName);
    Label1.Text = "上傳成功!";
    }
}

方法二:用Html控件HtmlInputFile,上傳到網站根目錄。

Test.aspx關鍵代碼:

代碼如下:

<form id="form1" runat="server">
<input type="file" id="file1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="上傳" OnClick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="" Style="color: Red"></asp:Label>
</form>

Test.aspx.cs關鍵代碼:

代碼如下:

protected void Button1_Click(object sender, EventArgs e)
{
    if (file1.PostedFile.ContentLength > 0)
    {
    file1.PostedFile.SaveAs(Server.MapPath("~/") + Path.GetFileName(file1.PostedFile.FileName));
    Label1.Text = "上傳成功!";
    }
}

方法三:用Html元素<input type="file" …/>,通過Request.Files上傳到網站根目錄。

Test.aspx關鍵代碼:

代碼如下:

<form id="form1" runat="server" enctype="multipart/form-data">
<input type="file" name="file" />
<asp:Button ID="Button1" runat="server" Text="上傳" OnClick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="" Style="color: Red"></asp:Label>
</form>

Test.aspx.cs關鍵代碼:

代碼如下:

protected void Button1_Click(object sender, EventArgs e)
{
    if (Request.Files["file"].ContentLength > 0)
    {
    Request.Files["file"].SaveAs(Server.MapPath("~/") + Path.GetFileName(Request.Files["file"].FileName));
    Label1.Text = "上傳成功!";
    }
}

注意兩個區別:

一:FileUpload.FileName獲取客戶端上傳文件名(不帶路徑),而file1.PostedFile.FileName 和Request.Files["file"].FileName在不同瀏覽器下情況不同:IE8下獲得的是客戶端上傳文件的完全限定名(帶路徑),谷歌、蘋果等瀏覽器下則仍為文件名(不帶路徑)。

二:FileUpload控件有HasFile屬性,用于判斷用戶是否選擇了上傳文件,而后面兩種方法則需要通過判斷上傳文件大小ContentLength屬性,當用戶沒有選擇上傳文件時,該屬性值為0。

可以看出FileUpload封裝程度更高,但靈活性也稍差。

例,Asp.net 文件上傳類(取得文件后綴名,保存文件,加入文字水印)

代碼如下:

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Drawing; 
using System.IO; 
using System.Drawing.Imaging;

 

namespace EC 

/// <summary> 
/// 上傳類 
/// </summary> 
public class UploadObj 
{

public UploadObj() 

// 
// TODO: 在此處添加構造函數邏輯 
// 

/// <summary> 
/// 允許文件上傳的類型枚舉 
/// </summary> 
public enum FileType 

jpg,gif,bmp,png 
}

#region 取得文件后綴 
/// <summary> 
/// 取得文件后綴 
/// </summary> 
/// <param name="filename">文件名稱</param> 
/// <returns></returns> 
public static string GetFileExtends(string filename) 

string ext = null; 
if (filename.IndexOf('.') > 0) 

string[] fs = filename.Split('.'); 
ext = fs[fs.Length - 1]; 

return ext; 

#endregion

#region 檢測文件是否合法 
/// <summary> 
/// 檢測上傳文件是否合法 
/// </summary> 
/// <param name="fileExtends">文件后綴名</param> 
/// <returns></returns> 
public static bool CheckFileExtends(string fileExtends) 

bool status = false; 
fileExtends = fileExtends.ToLower(); 
string[] fe = Enum.GetNames(typeof(FileType)); 
for (int i = 0; i < fe.Length; i++) 

if (fe[i].ToLower() == fileExtends) 

status = true; 
break; 


return status; 

#endregion

#region 保存文件 
/// <summary> 
/// 保存文件 
/// </summary> 
/// <param name="fpath">全路徑,Server.MapPath()</param> 
/// <param name="myFileUpload">上傳控件</param> 
/// <returns></returns> 
public static string PhotoSave(string fpath,FileUpload myFileUpload) 

string s = ""; 
string fileExtends = ""; 
string fileName = myFileUpload.FileName; 
if (fileName != "") 

//取得文件后綴 
fileExtends = EC.UploadObj.GetFileExtends(fileName); 
if (!EC.UploadObj.CheckFileExtends(fileExtends)) 

EC.MessageObject.ShowPre("上傳文件類型不合法"); 

Random rd = new Random(); 
s = EC.RandomObject.DateRndName(rd) + "." + fileExtends; 
string file = fpath + "/" + s; 
try 

myFileUpload.SaveAs(file); 

catch (Exception ee) 

throw new Exception(ee.ToString()); 


return s; 
}

#endregion

#region 加入文字水印

/// <summary> 
/// 加入文字水印 
/// </summary> 
/// <param name="fileName">文件名稱路徑(全路徑)</param> 
/// <param name="text">文件</param> 
public void AddTextToImg(string fileName, string text) 

if (!File.Exists(fileName)) 

throw new FileNotFoundException("文件不存在"); 

if (text == string.Empty) 

return; 
}

System.Drawing.Image image = System.Drawing.Image.FromFile(fileName); 
Bitmap bitmap = new Bitmap(image, image.Width, image.Height); 
Graphics g = Graphics.FromImage(bitmap); 
float fontSize = 12.0f;//字體大小 
float textWidth = text.Length * fontSize;//文本的長度 
//下面定義一個矩形區域,以后在這個矩形里面畫上白底黑字 
float rectX = 0; 
float rectY = 0; 
float rectWidth = text.Length * (fontSize + 8); 
float rectHeight = fontSize + 8; 
//聲明矩形域 
RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight); 
Font font = new Font("宋體", fontSize);//定義字體 
Brush whiteBrush = new SolidBrush(Color.White);//白筆刷,畫文字用 
Brush blackBrush = new SolidBrush(Color.Black);//黑筆刷,畫背景用 
g.FillRectangle(blackBrush, rectX, rectY, rectWidth, rectHeight); 
g.DrawString(text, font, whiteBrush, textArea); 
MemoryStream ms = new MemoryStream(); 
bitmap.Save(ms, ImageFormat.Jpeg); 
//輸出處理后的圖像,這里為了演示方便,我將圖片顯示在頁面中了 
//Response.Clear(); 
//Response.ContentType = "image/jpeg"; 
//Response.BinaryWrite(ms.ToArray()); 
g.Dispose(); 
bitmap.Dispose(); 
image.Dispose(); 

#endregion 

}

ASP.NET的弊端

 ASP.NET處理文件上傳的最大的問題在于內存占用太高,由于將整個文件載入內存進行處理,導致如果用戶上傳文件太大,或者同時上傳的用戶太多,會造成服務器端內存耗盡。這個觀點其實是片面的,對于早期ASP.NET 1.X,為了供程序處理,會將用戶上傳的內容完全載入內存,這的確會帶來問題,但在ASP.NET 2.0中就已經會在用戶上傳數據超過一定數量之后將其存在硬盤中的臨時文件中,而這點對于開發人員完全透明,也就是說,開發人員可以像以前一樣進行數據流的處理,這個也在httpRuntime里通過requestLengthDiskThreshold 屬性來設置閾值(threshold),其默認值為256,即一個請求內容超過256KB時就會啟用硬盤作為緩存,這個閾值和客戶端是否是在上傳內容無關,只關心客戶端發來的請求大于這個值。因此,在ASP.NET 2.0中服務器的內存不會因為客戶端的異常請求而耗盡。另外一個弊端就是當請求超過maxRequestLength(默認4M)之后,ASP.NET處理程序將不會處理該請求。這和ASP.NET拋出一個異常完全不同,這就是為什么如果用戶上傳文件太大,看到的并不是ASP.NET應用程序中指定的錯誤頁面(或者默認的),因為ASP.NET還沒有對這個請求進行處理。

還有一個問題就是處理ASP.NET大文件上傳的超時。這個其實可以通過在運行時讀取web.config中的httpRuntime節,并轉化為 HttpRuntimeSection對象或者重寫Page.OnError()來檢測HTTP Code(相應代碼)是否為400來處理,這里不再贅述

代碼如下:

    System.Configuration.Configuration   
    config = WebConfigurationManager.  
    OpenWebConfiguration("~");  
    HttpRuntimeSection section = config.GetSection  
    ("system.web/httpRuntime") as HttpRuntimeSection;  
    double maxFileSize = Math.Round  
    (section.MaxRequestLength / 1024.0, 1);  
    string errorString = string.Format("Make sure   
    your file is under {0:0.#} MB.", maxFileSize);

 

    protected override void OnError(EventArgs e)  
    {  
    HttpContext ctx = HttpContext.Current;  
    Exception exception = ctx.Server.GetLastError (); 

    string errorString =   
"
    Offending URL: " + ctx.Request.Url.ToString () +  
"
    Source: " + exception.Source +   
"
    Message: " + exception.Message +  
"
    Stack trace: " + exception.StackTrace; 

    ctx.Response.Write (errorString); 

    ctx.Server.ClearError (); 

    base.OnError (e);  
    } 

對于文件上傳的功能需要較為特別的需求——例如進度條提示,ASP.NET封裝的控件〈asp:FileUpload /〉就無能為力了。

好的解決方案

Robert Bazinet建議,最好的解決方案是使用RIA,大多數情況下,建議用Silverlight或 Flash的上傳組件來替代傳統的FileUpload組件,這類組件不只是提供了更好的上傳體驗,也比〈input type="file"〉標簽在頁面上的文本框、按鈕漂亮,這個〈input type="file"〉標簽并不能夠通過CSS添加樣式,不過也有人嘗試去解決了。至今為止并沒有什么商業上傳組件使用了Silverlight,不過這里有演示了用Silverlight進行多文件上傳的示例程序。當然使用Silverlight就可以很輕松的實現多線程上傳,斷點續傳這種功能了,這些都不是我要詳細討論的內容,如果有需要可以自己去看下。

可選擇的解決方案

使用〈input type="file" /〉標簽所能提供的支持非常有限,一些特殊需求我們不能實現——或者說是無法輕易地、直接地實現。所以為了實現這樣的功能我們每次都要繞一個大大的彎。為了避免每次實現相同功能時都要費神費時地走一遍彎路,市面上或者開源界出現了各種上傳組件,上傳組件提供了封裝好的功能,使得我們在實現文件上傳功能時變得輕松了很多。例如幾乎所有的上傳組件都直接或間接地提供了進度提示的功能,有的提供了當前的百分比數值,有的則直接提供了一套UI;有的組件只提供了簡單的UI,有的卻提供了一整套上傳、刪除的管理界面。此外,有的組件還提供了防止客戶端惡意上傳的能力。

我覺得最好的辦法是在HttpModule里分塊讀取文件并且保持頁面激活的狀態,這樣就不會超時,同時也可以跟蹤進度或者取消上傳,或者通過 HttpHandler實現,在通過進度條給用戶充分提示的同時,也讓開發人員能夠更好地控制文件大小以及上傳過程中可能出現的異常。上傳組件都是用這些辦法的,我們的選擇有:

FileUploader.NET (MediaChase公司,$310以上)

RadUpload (Telerik公司,$249)

NeatUpload (免費,遵守LGPL協議)

NeatUpload是在ASP.NET Pipeline的BeginRequest事件中截獲當前的HttpWorkerRequest對象,然后直接調用其ReadEntityBody等方法獲取客戶端傳遞過來的數據流,并加以分析和處理。并通過使用新的請求進行輪詢來獲取當前上傳的狀態。關于NeatUpload和其他開源組件的介紹可以參看JeffreyZhao的在ASP.NET應用程序中上傳文件,當然他還說了MembaVelodoc XP Edition和swfupload,寫的非常棒!

HttpWorkerRequest實現介紹

利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法從IIS為ASP.NET建立的pipe里分塊讀取數據可以實現文件上傳。實現方法如下:

代碼如下:

IServiceProvider provider=(IServiceProvider)  
HttpContext.Current;  
HttpWorkerRequest wr=(HttpWorkerRequest)  
provider.GetService(typeof(HttpWorkerRequest));  
byte[] bs=wr.GetPreloadedEntityBody();  
if(!wr.IsEntireEntityBodyIsPreloaded())  
{  
int n=1024;  
byte[] bs2=new byte[n];  
while(wr.ReadEntityBody(bs2,n) 〉0)  
{  
}  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产女人精品视频| 美日韩精品免费视频| 国产精品高精视频免费| 中文一区二区视频| 性欧美视频videos6一9| 中文字幕在线看视频国产欧美在线看完整| 国产精品久久久久久久久久久久久久| 国产精品啪视频| 亚洲色图第一页| 久久久精品国产| 日韩一区二区欧美| 亚洲第一男人天堂| 欧美激情视频一区二区| 欧美性猛交xxxxx免费看| 成人观看高清在线观看免费| 国产免费观看久久黄| www.精品av.com| 欧美不卡视频一区发布| 国产精品成人一区二区三区吃奶| 日本国产欧美一区二区三区| 欧美在线观看日本一区| 欧美国产乱视频| 午夜精品国产精品大乳美女| 中文欧美日本在线资源| 91麻豆国产精品| 日本国产精品视频| 欧美孕妇性xx| 欧美大胆在线视频| 欧美激情亚洲一区| 久久夜精品va视频免费观看| 日本电影亚洲天堂| 精品久久久久久久中文字幕| 韩国精品久久久999| 欧美激情精品久久久| 国产精品九九久久久久久久| 日韩精品999| 奇米四色中文综合久久| 国产成人精品免高潮在线观看| 日韩中文视频免费在线观看| 国产精品亚洲激情| 久久成人免费视频| 奇米影视亚洲狠狠色| 亚洲精品福利在线观看| 国产精品久久久久久久久免费看| 久久夜色撩人精品| 久久免费视频观看| 亚洲成人av片在线观看| 九九九久久久久久| 91亚洲国产成人久久精品网站| 日韩成人在线视频网站| 亚洲视频综合网| 国产精品视频公开费视频| 亚洲精品第一国产综合精品| 亚洲精品国产欧美| 久久精品91久久香蕉加勒比| 亚洲精选中文字幕| 国产精品18久久久久久麻辣| 久久久久久成人精品| 亚洲色图17p| 在线播放日韩av| 亚洲一区中文字幕在线观看| 久久精品久久久久电影| 欧美日韩一区二区免费在线观看| 91精品国产91久久久久久吃药| www高清在线视频日韩欧美| 日韩精品免费综合视频在线播放| 一区二区三区天堂av| 亚洲黄色片网站| 91久久国产精品91久久性色| 一区二区日韩精品| 大荫蒂欧美视频另类xxxx| 欧美寡妇偷汉性猛交| 欧美在线视频免费| 国产精品影片在线观看| 日韩欧美中文字幕在线播放| 97久久精品人人澡人人爽缅北| 亚洲国产日韩欧美在线99| 久久久久久久久久国产精品| 亚洲精品国产福利| 成人黄色午夜影院| 色偷偷噜噜噜亚洲男人| 亚洲成人亚洲激情| 国产精品av在线播放| 日韩精品中文字幕久久臀| 国产在线拍揄自揄视频不卡99| 日韩在线欧美在线| 日韩国产中文字幕| 欧美激情视频一区二区| 成人亚洲欧美一区二区三区| 亚洲第一区中文99精品| 91精品国产色综合久久不卡98口| 国产国产精品人在线视| 九九综合九九综合| 精品成人乱色一区二区| www.久久久久久.com| 91丝袜美腿美女视频网站| 97久久精品国产| 欧美激情视频在线观看| 91成品人片a无限观看| 日韩中文综合网| 粉嫩老牛aⅴ一区二区三区| 深夜福利91大全| 成人精品视频在线| 亚洲天堂男人天堂女人天堂| 日本中文字幕成人| 亚洲图片在区色| 久久久久久久97| 亚洲色无码播放| 欧美午夜激情视频| 91性高湖久久久久久久久_久久99| 8090成年在线看片午夜| 在线亚洲国产精品网| 欧美激情视频一区二区三区不卡| 国产精品久久久久久影视| 国产最新精品视频| 欧美激情按摩在线| 性色av一区二区三区红粉影视| 亚洲欧美日韩视频一区| 亚洲欧洲视频在线| 亚洲美女黄色片| 日韩中文字幕在线| 日韩免费观看高清| 欧美激情乱人伦| 欧美成人合集magnet| 亚洲第一区中文99精品| 日韩视频欧美视频| 久久夜色精品亚洲噜噜国产mv| 青青久久av北条麻妃黑人| 久久香蕉国产线看观看av| 欧美与欧洲交xxxx免费观看| 91国偷自产一区二区三区的观看方式| 日韩专区在线观看| 欧美一级大片在线观看| 欧美日韩裸体免费视频| 欧美在线一区二区三区四| 91免费视频网站| 欧洲亚洲免费视频| 成人做爰www免费看视频网站| 日韩一区二区久久久| 欧美成人午夜免费视在线看片| 欧美性xxxxx| 日韩国产精品一区| 91精品国产一区| 韩日欧美一区二区| 国产精品三级久久久久久电影| 国产亚洲精品日韩| 亚洲第一中文字幕| 精品综合久久久久久97| 日韩电影在线观看中文字幕| 国产精品99久久久久久白浆小说| 成人黄色激情网| 国产精品精品视频一区二区三区| 国产精品香蕉在线观看| 欧美成人亚洲成人日韩成人| 国产日韩欧美在线观看| 91日韩在线视频| 国产有码在线一区二区视频| 亚洲精品一区av在线播放| 亚洲色图校园春色| 成人激情综合网| 亚洲二区在线播放视频| 久久久免费精品视频| 亚洲精品一区二区三区不| 国产中文欧美精品|