2010/1/20

多功能 FileUpload 使用者控制項

我寫了一個可以處理檔案上傳的多功能使用者控制項,除了可以處理一般的檔案上傳之外,還可以動態修改上傳路徑、讓使用者決定是否覆蓋舊檔,並動態決定是否限制使用者只能接受圖型檔案

.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。如果你希望能支援更大檔案, 可以再增加以上這個值。

沒有留言:

張貼留言