我寫了一個可以處理檔案上傳的多功能使用者控制項,除了可以處理一般的檔案上傳之外,還可以動態修改上傳路徑、讓使用者決定是否覆蓋舊檔,並動態決定是否限制使用者只能接受圖型檔案。
.ascx 檔案如下:
<asp:Label ID="lblCaption" runat="server" Text="上傳檔案(限制500M以下)"></asp:Label>: <asp:FileUpload ID="fup" runat="server" onkeypress="return false;" /> <asp:CheckBox ID="cbOverwrite" runat="server" Text="覆寫舊檔" /><br /> <asp:Button ID="btnUpload" runat="server" Text="上傳" OnClick="btnUpload_Click" /> <asp:Label ID="lbResult" runat="server"></asp:Label>
Code behind 程式:
using System; using System.IO; namespace Johnny.Shared { public partial class ucFileUpload : System.Web.UI.UserControl { private string _UploadPath = "/Uploads/"; ////// 設定檔案的上傳目錄。若未指定則使用預設值 /Uploads/ /// public string UploadPath { get { return _UploadPath; } set { _UploadPath = value; } } ////// 設定標題 /// public string Caption { get { return lblCaption.Text; } set { lblCaption.Text = value.Trim(); } } private bool _CheckFileTypes = false; ////// 決定是否檢查所上傳者是否為指定的圖片格式,包括 Jpeg, Gif 和 Png /// public bool CheckImageFileTypes { get { return _CheckFileTypes; } set { _CheckFileTypes = value; } } protected void Page_Load(object sender, EventArgs e) { } protected void btnUpload_Click(object sender, EventArgs e) { if (fup.HasFile) { try { bool isValidUpload = false; if (File.Exists(Server.MapPath(UploadPath + fup.FileName))) // 資料夾中已有同名檔案存在 if (cbOverwrite.Checked) // 資料夾中已有同名檔案存在且有勾選「覆寫舊檔」 isValidUpload = true; else { isValidUpload = false; lbResult.Text = "錯誤: 網站中已有同名檔案存在。如果你確定要覆蓋該檔案,你必須勾選「覆寫舊檔」。"; } else isValidUpload = true; if (isValidUpload) { if (CheckImageFileTypes) { if (!(fup.PostedFile.ContentType == "image/pjpeg") || !(fup.PostedFile.ContentType == "image/jpeg") || !(fup.PostedFile.ContentType == "image/gif") || !(fup.PostedFile.ContentType == "image/x-png") || !(fup.PostedFile.ContentType == "image/svg+xml")) { lbResult.Text = "抱歉,您只能上傳圖形格式檔案!您所上傳的檔案不在接受範圍內。"; return; } } fup.SaveAs(Server.MapPath(UploadPath + fup.FileName)); lbResult.Text = "檔案上傳成功! " + " > 檔名: " + fup.PostedFile.FileName + " " + " > 大小: " + fup.PostedFile.ContentLength + " KB " + " > 類型: " + fup.PostedFile.ContentType; } } catch (Exception ex) { lbResult.Text = "錯誤: 發生不明錯誤,請通報網站管理員。可能因為檔案太大或傳輸問題所引起。Error: " + ex.Message; } } else // 使用者未選取檔案或檔案在客戶端找不到 lbResult.Text = "您必須選擇一個檔案才能上傳"; } } }
以上程式都已寫有詳細的註解,就恕我不再一一說明了。
提醒一下, ASP.NET 預設的最大上傳檔案大小為 4M, 這對現代的各種檔案恐怕都嫌太小。你可以在 Web.config 中把這個限制放寬一點, 方法是改寫 httpRuntime 區段和 system.webServer 區段如下:
<system.web> <httpRuntime targetFramework="4.5" maxRequestLength="512000" /> <!-- 放寬最大檔案上傳大小為 500M --> .... <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="524288000" /> <!-- 放寬最大檔案上傳大小為 500M --> </requestFiltering> </security> ....
如此改寫之後, 可上傳的檔案大小變成 500M。如果你希望能支援更大檔案, 可以再增加以上這個值。
沒有留言:
張貼留言