我寫了一個可以處理檔案上傳的多功能使用者控制項,除了可以處理一般的檔案上傳之外,還可以動態修改上傳路徑、讓使用者決定是否覆蓋舊檔,並動態決定是否限制使用者只能接受圖型檔案...
我寫了一個可以處理檔案上傳的多功能使用者控制項,除了可以處理一般的檔案上傳之外,還可以動態修改上傳路徑、讓使用者決定是否覆蓋舊檔,並動態決定是否限制使用者只能接受圖型檔案。
.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。如果你希望能支援更大檔案, 可以再增加以上這個值。