.Net通用大檔案上傳類(可上傳大檔案,vs2005)

yyldir發表於2009-05-09

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.IO;

namespace letwego.cn
{
    
/// <summary>
    
/// .Net通用大檔案上傳類(可上傳大檔案,vs2005)
    
/// 作者:啟程 www.letwego.cn
    
/// 保留作者資訊,可用於任意用途
    
/// </summary>

    public class UploadFile
    
{
        
//欄位
        private string _UploadInfo;  // 檔案上傳的返回資訊。
        private int _UploadState;  // 檔案上傳的返回狀態 0 為成功。
        private string _FileType;  // 允許上傳檔案的型別。
        private int _FileSize;  // 上傳檔案的大小。
        private int _MaxFileSize;  // 上傳檔案大小的最大長度。
        private string _NewFileName;  // 上傳後的檔名。

        
//初始
        public UploadFile()
        
{
            _UploadInfo 
= "NONE";
            _UploadState 
= -1;
            _FileType 
= "*";
            _MaxFileSize 
= 1024000;//1000k
            _NewFileName = "";
        }


        
#region 屬性
        
/// <summary>
        
/// 檔案上傳的返回資訊
        
/// </summary>

        public string UploadInfo
        
{
            
set { _UploadInfo = value; }
            
get return _UploadInfo; }
        }

        
/// <summary>
        
/// 檔案上傳的返回狀態 0 成功 1 沒有選擇檔案或者0位元組 2 檔案太大 3 檔案型別不允許
        
/// </summary>

        public int UploadState
        
{
            
set { _UploadState = value; }
            
get return _UploadState; }
        }

        
/// <summary>
        
/// 允許上傳檔案的型別,* 或預設代表可任意型別,例 "jpg|gif|bmp"
        
/// </summary>

        public string FileType
        
{
            
set { _FileType = value; }
            
get return _FileType; }
        }

        
/// <summary>
        
/// 上傳檔案的大小
        
/// </summary>

        public int FileSize
        
{
            
get return _FileSize / 1024; }
        }

        
/// <summary>
        
/// 上傳檔案大小的最大長度
        
/// </summary>

        public int MaxFileSize
        
{
            
set { _MaxFileSize = value * 1024; }
            
get return _MaxFileSize / 1024; }
        }

        
/// <summary>
        
/// 上傳後的檔名
        
/// </summary>

        public string NewFileName
        
{
            
set { _NewFileName = value; }
            
get return _NewFileName; }
        }


        
#endregion


        
#region 上傳主程式
        
/// <summary>
        
/// 上傳本地檔案到伺服器。
        
/// </summary>
        
/// <param name="strSaveDir">在伺服器端儲存的物理路徑。</param>
        
/// <param name="HtmCtrlObjUploadFile">上傳的檔案物件 Input(File)。</param>
        
/// <returns></returns>

        public void ExecUploadFile(string strSaveDir, HtmlInputFile HtmCtrlObjUploadFile)
        
{
            
int intFileExtPoint = HtmCtrlObjUploadFile.PostedFile.FileName.LastIndexOf("."); //儲存最後一個 . 號的位置
            string strFileExtName = HtmCtrlObjUploadFile.PostedFile.FileName.Substring(intFileExtPoint + 1).ToLower();  // 獲取要上傳的檔案的字尾名。

            _FileSize 
= HtmCtrlObjUploadFile.PostedFile.ContentLength;//檔案大小 byte

            
if (_FileSize == 0)  // 判斷是否有檔案需要上傳或所選檔案是否為0位元組。
            {
                _UploadInfo 
= "沒有選擇要上傳的檔案或所選檔案大小為0位元組";
                _UploadState 
= 1;
                
return;  // 返回檔案上傳狀態和資訊。
            }

            
if (_FileSize > _MaxFileSize)  // 限制要上傳的檔案大小(byte)。
            {
                _UploadInfo 
= "上傳的檔案超過限制大小(" + (_MaxFileSize / 1024).ToString() + "K)";
                _UploadState 
= 2;
                
return;  // 返回檔案上傳狀態和資訊。
            }


            
if (_FileType != "*")
            
{
                
if (_FileType.ToLower().IndexOf(strFileExtName.ToLower().Trim()) == -1)  // 判斷要上傳的檔案型別的是否在允許的範圍內。
                {
                    _UploadInfo 
= "不允許上傳的檔案型別(允許的型別:" + _FileType + ")";
                    _UploadState 
= 3;
                    
return;  // 返回檔案上傳狀態和資訊
                }

            }


            
if (_NewFileName == "")
            
{
                DateTime dteNow 
= DateTime.Now;  // 定義日期物件,為上傳後的檔案命名。
                _NewFileName = dteNow.Year.ToString() + dteNow.Month.ToString() + dteNow.Day.ToString() + GetRandomStr(8);  // 隨機地為上傳後的檔案命名。
                _NewFileName = _NewFileName + "." + strFileExtName; //包含副檔名的檔名
            }

            HtmCtrlObjUploadFile.PostedFile.SaveAs(
this.GetSaveDirectory(strSaveDir) + _NewFileName);  // 以新的檔名儲存上傳的檔案到指定物理路徑。            
            _UploadInfo = "檔案上傳成功";  // 返回上傳後的伺服器端檔案物理路徑。
            _UploadState = 0;

        }

        
#endregion


        
#region 獲取指定位數的隨機數
        
/// <summary>
        
/// 獲取指定位數的隨機數。
        
/// </summary>
        
/// <param name="RndNumCount">隨機數位數。</param>
        
/// <returns></returns>

        private string GetRandomStr(int RndNumCount)
        
{
            
string RandomStr;
            RandomStr 
= "";
            Random Rnd 
= new Random();
            
for (int i = 1; i <= RndNumCount; i++)
            
{
                RandomStr 
+= Rnd.Next(09).ToString();
            }

            
return RandomStr;
        }

        
#endregion


        
#region 獲取上傳檔案存放目錄
        
/// <summary>
        
/// 獲取上傳檔案存放目錄。
        
/// </summary>
        
/// <param name="DirectoryPath">存放檔案的物理路徑。</param>
        
/// <returns>返回存放檔案的目錄。</returns>

        public string GetSaveDirectory(string DirectoryPath)
        
{
            
if (!Directory.Exists(DirectoryPath))  // 判斷當前目錄是否存在。
            {
                Directory.CreateDirectory(DirectoryPath);  
// 建立上傳檔案存放目錄。
            }

            
return DirectoryPath;
        }

        
#endregion


    }


    
#region 附   修改上傳大小的配置
    
/*
    需要修改的是
    在 C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/CONFIG目錄裡,
    找到檔案maxRequestLength="4096"
    將值修改大一些,例如:102400
    這個引數的單位應該是KB的

    以上方法是修改全域性的,如果公需要修改一個專案,那麼是修改專案裡的Web.config檔案

    在<system.web></system.web>之間新增,
    <httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="21000" executionTimeout="300" />
    其中,
    maxRequestLength:設定上傳檔案的最大值,單位:KB。(預設是4096KB,即4M)
    executionTimeout:設定超時時間,單位:秒。(預設是90秒) 

    
*/

    
#endregion

}

相關文章