原文出處
之前的两个范例:
昨天上课时,有个学员拿这个范例来与我讨论,希望把写法作一下修改:
==== 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的方法来写程序,可能会被前辈「念」一顿
****************************************************************************************************************************
第一次改良:
学员原本提供的作法:
01 | protected void Button1_Click(object sender, EventArgs e) | |
02 | { |
03 | //== 方法一。 ========================================== | |
04 | BatchFileUpload(FileUpload1); //==自己写的function |
05 | BatchFileUpload(FileUpload2); |
06 | BatchFileUpload(FileUpload3); |
07 | BatchFileUpload(FileUpload4); |
08 | BatchFileUpload(FileUpload5); |
09 | } | |
10 |
|
11 |
| |
12 | //*********************************************************** |
13 | protected void BatchFileUpload(FileUpload myFL) | |
14 | { |
15 | String savePath = @"d:\temp\uploads\"; | |
16 |
|
17 | if (myFL.HasFile) | |
18 | { |
19 | String fileName = myFL.FileName; | |
20 |
|
21 | savePath = savePath + fileName; | |
22 | myFL.SaveAs(savePath); |
23 |
| |
24 | Label1.Text += "上传成功,档名---- " + fileName; |
25 | } | |
26 |
|
27 | } |
上面的作法是把重复的程序,写成一个 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)