2013年9月5日 星期四

FileUpload控制項「批次上傳 / 多檔案同時上傳」的範例--以「流水號」產生「變數名稱」

 

 

之前的兩個範例:

[C# / ASP.NET]FileUpload控制項「批次上傳 / 多檔案同時上傳」的範例(C#語法)

[VB / ASP.NET]FileUpload控制項「批次上傳 / 多檔案同時上傳」的範例 (VB語法)

 

 

昨天上課時,有個學員拿這個範例來與我討論,希望把寫法作一下修改:

 

==== HTML畫面設計 =====

    首先,進行HTML畫面的設計,

    多重檔案、批次上傳......在畫面上使用多個 FileUpload控制項,然後搭配一個按鈕控制項即可

    

 

==== 後置程式碼 =====

    初學者也可以乖乖地用五個 if判別式來作

    (一個 FileUpload控制項,就作一次,    程式碼不斷COPY 修改即可)。

    只要程式能順利執行,而且您又是剛剛入門的初學者......沒人敢說這樣做不好。

    以下是範例:

if (FileUpload1.HasFile)
{
          string fileName = FileUpload1.FileName;

          //……內容與上面範例相同,在此省略…… 

          FileUpload1.SaveAs(savePath);               
          myLabel.Append("<br>檔名---- " + fileName);
 }

if (FileUpload2.HasFile)
{
          string fileName = FileUpload2.FileName;
          //……省  略……
          FileUpload2.SaveAs(savePath) ;     
}

if (FileUpload3.HasFile)
{
          string fileName = FileUpload3.FileName;
          //……省  略……
          FileUpload3.SaveAs(savePath) ;     
}

//……以此類推……  這種Copy / Paste的作法很累吧~

 

學生(初學者)還在學習中,所以寫出上面的程式,我不會責怪他,畢竟能正確執行更重要。

但如果進入業界,還用這種 Copy / Paste的方法來寫程式,可能會被前輩「唸」一頓

 

****************************************************************************************************************************

第一次改良:

    學員原本提供的作法:

    protected void Button1_Click(object sender, EventArgs e)
    {
        //== 方法一。 ==========================================
        BatchFileUpload(FileUpload1);  //==自己寫的function
        BatchFileUpload(FileUpload2);
        BatchFileUpload(FileUpload3);
        BatchFileUpload(FileUpload4);
        BatchFileUpload(FileUpload5);
    }


    //***********************************************************
    protected void BatchFileUpload(FileUpload myFL)
    {
        String savePath = @"d:\temp\uploads\";

        if (myFL.HasFile)
        {
            String fileName = myFL.FileName;

            savePath = savePath + fileName;
            myFL.SaveAs(savePath);

            Label1.Text += "上傳成功,檔名---- " + fileName;
        }

    }

 

上面的作法是把重複的程式,寫成一個 function來呼叫

不斷地傳入「FileUpload控制項」就能完成多重檔案的上傳。

 

 

****************************************************************************************************************************

第二次改良:

    上述的範例,可以利用 「流水號」產生「變數名稱」 來縮減

 

    protected void Button1_Click(object sender, EventArgs e)
    {
        //== 兩種作法,任選其一 ===================================
 
        //== 方法一。 ==========================================
        // BatchFileUpload(FileUpload1);  //==自己寫的function
        // BatchFileUpload(FileUpload2);
        // BatchFileUpload(FileUpload3);
        // BatchFileUpload(FileUpload4);
        // BatchFileUpload(FileUpload5);
 
        //== 方法二。改寫如下 =====================================
         //== 透過  for 迴圈,以字串相連的方式,做出流水號(連號)的 「變數名稱」
 
        for (int i = 1; i <= Request.Files.Count; i++)
        {
            //***************************************************************
            FileUpload myFL = (FileUpload)Page.Form.FindControl("FileUpload" + i);
            //***************************************************************
 
            BatchFileUpload(myFL);  //==自己寫的function
        }
    }
 
 
    protected void BatchFileUpload(FileUpload myFL)
    {
        //-- 註解:先設定好檔案上傳的路徑,這是Web Server電腦上的目錄。
        //       C#語法在撰寫磁碟的目錄位置時,請留意以下的寫法:
        String savePath = "d:\\temp\\uploads\\";
 
        if (myFL.HasFile)
        {
            String fileName = myFL.FileName;
 
            savePath = savePath + fileName;
            myFL.SaveAs(savePath);
 
            Label1.Text += "<br />上傳成功,檔名---- " + fileName;
        }

 

上面的作法(以「流水號」產生「變數名稱」

    在書本「上集」的聊天室、多重檔案上傳

    書本「下集」的自動化投票區,都有用到相同的技巧。

 

從以前的 ASP到目前的 ASP.NET,包含 PHP與 JSP,我都測試過。   這個技巧都通用!

 

 

 

2012/9/5補充:另外一種作法,請參閱  http://www.allenkuo.com/userfiles/share/2012q3/2012-8-28_08-28-10.png

 

 

另外提供一個很棒的 FileUpload範例,也提到 .ashx的作法(作者:Y2J)

 

 

 --------------------------------------------------------------------------------------------------------------------------------------------

  • 2008/8/11補充:感謝 Nick網友的回應,在MasterPage底下,這段程式會出現一些錯誤。
  • 只有一行必須修改成----
  • myFL = CType(Me.Master.FindControl("ContentPlaceHolder1").FindControl("FileUpload" & i), FileUpload)

Nick網友修改後的範例:Project.rar

 

 

沒有留言: