C# FileUpload使用过程遇到的问题

C# FileUpload 使用过程

从控件列表拖出FileUpload控件放在网页上面,运行网页,就可以进行文件选择了,很方便

先说说主要的属性、方法吧

FileUpload.FileName属性:该属性用于获取客户端上使用FileUpload控件上的文件的名称

FileUpload.SaveAs方法:使用FileUpload控件,将上传文件的内容保存到Web服务器上的制定路径。其语法如下:

Public void SaveAs(string filename)

参数filename:一个字符串,用于指定服务器上保存上传文件的位置的完整路径。

配置文件设定上传文件大小

有两种方法:

第一种,你可以写判断来决定是否上传

1 FileUpload1.PostedFile.ContentLength

第二种,你可以更改上传文件的大小的限制

在web.config中的 <system.web> </system.web内加入如下代码:

<httpRuntime executionTimeout="600" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" />

executionTimeout:表示允许执行请求的最大时间限制,单位为秒

maxRequestLength:指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。好像最大可以改成2G吧

将一个文件上传到指定目录,非常方便,用FileUpload也非常简单。

可实际情况中,会需要一次性选择多个文件,上传多个文件,如果上传的是图片,还得增加预览功能,其次就是一个上传的进度条问题。

先说说选择多个文件吧,这是控件的问题,貌似修改不了,没办法,只能一次选择一个。

上传多个文件:页面加载时,就加载多个FileUpload控件,如果数目不确定,那就动态创建,然后动态创建过程中呢,并不是纯粹的直接构造一个FileUpload添加即可,而是需要走如下流程:1.清空显示FileUpload的区域。2.加载缓存中的FileUpload控件。3.构造一个新的FileUpload控件并添加到页面。4.将该区域的FileUpload重新全部储存在缓存中。

 1 /// <summary>
 2     /// 添加FileUpload
 3     /// </summary>
 4     private void AddFileUpload()
 5     {
 6         // 清除表格原有内容
 7         tab_FileUpload_Area.Rows.Clear();
 8         // 加载缓存中的上传控件
 9         GetFileUpload();
10         // 新增上传控件
11         InsertFileUploadToTable(new FileUpload());
12         // 保存当前页面的上传控件
13         SetFileUpload();
14     }
15 
16     /// <summary>
17     /// 加载缓存中的FileUpload
18     /// </summary>
19     private void GetFileUpload()
20     {
21         ArrayList arrayList = new ArrayList();
22         if (Session["FilesControls"] != null)
23         {
24             arrayList = (ArrayList)Session["FilesControls"];
25             for (int i = 0; i < arrayList.Count; i++)
26             {
27                 InsertFileUploadToTable((FileUpload)arrayList[i]);
28             }
29         }
30     }
31 
32     /// <summary>
33     /// 保存当前页面的FileUpload控件
34     /// </summary>
35     private void SetFileUpload()
36     {
37         ArrayList arrayList = new ArrayList();
38 
39         foreach (Control c in tab_FileUpload_Area.Controls)
40         {
41             if (c.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlTableRow")
42             {
43                 HtmlTableCell tabCell = (HtmlTableCell)c.Controls[0];
44                 foreach (Control control in tabCell.Controls)
45                 {
46                     if (control.GetType().ToString() == "System.Web.UI.WebControls.FileUpload")
47                     {
48                         FileUpload f = (FileUpload)control;
49                         arrayList.Add(f);
50                     }
51                 }
52             }
53         }
54 
55         Session["FilesControls"] = arrayList;
56 
57     }
58 
59     /// <summary>
60     /// 创建FileUpload控件,并添加
61     /// </summary>
62     /// <param name="fileUpload"></param>
63     private void InsertFileUploadToTable(System.Web.UI.WebControls.FileUpload fileUpload)
64     {
65         HtmlTableRow tabRow = new HtmlTableRow();
66         HtmlTableCell tabCell = new HtmlTableCell();
67         tabCell.Controls.Add(fileUpload);
68         tabRow.Controls.Add(tabCell);
69         tab_FileUpload_Area.Rows.Add(tabRow);
70     }

这种操作呢,存在一个问题,就是在重新加载FileUpload的时候,会导致原来已经选择过的,也会被清空,从而需要重新选择。

针对这种情况,可以结合按钮进行触发FileUpload事件触发,然后label显示获取的路径,至于FileUpload则隐藏掉,后台进行路径保存,然后再加载,也可以达到效果。

1.页面增加FileUpload、出发按钮、显示路径的文本

1 <asp:FileUpload  runat="server"  onpropertychange="show(this.value)" />
2             <input  type="button" value="选择图片文件" onclick="fileClickFun()" /><label ></label>

2.绑定按钮的单击触发事件

1 function fileClickFun() { 2 document.getElementById("fu_serverUpload").click(); 3 }

3.后台代码为FileUpload绑定事件

1 protected void Page_Load(object sender, EventArgs e)
2     {
3         this.fu_serverUpload.Attributes.Add("onchange", "label_text();");
4     }

4.获取图片路径,并在DIV中显示

 1 function label_text() {
 2                     var file_upl = document.getElementById('fu_serverUpload');
 3 
 4                     file_upl.select();
 5 
 6                     var realpath = document.selection.createRange().text;
 7 
 8                     document.getElementById("lbl_showUrl").innerHTML = document.getElementById("fu_serverUpload").value;
 9 
10 }

在获取路径这里呢,又存在一个问题,就是IE6以上的浏览器,会启用上传的保护机制,用户选择文件后,反馈回来的路径不是原始路径,而是C:\fakepath\XXXXXX这样的路径,当然,这种情况的解决办法呢,是需要客户在IE的安全设置里面进行设置,即可获取完成的路径。而在网上有网友说可以不设置,就能获取完整的,我试验之后,IE6可以,但是IE8、9还得设置之后才能获取。

设置步骤如下:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可。

在这里另外值得一提的是div显示图片,嘎嘎,似乎有防盗功能耶,显示之后,在网页上面不能选中,也不能另存,嘎嘎

 1 <script type="text/javascript">
 2                 function show(upimg) {
 3                     var dd = document.getElementById("divview");
 4                     dd.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = upimg;
 5                     //dd.style.width = 166;
 6                     //dd.style.height = 190;
 7 
 8                     // 此行代码的效果是:限制图片的大小在设定宽度长度范围内,如果不增加该行代码,图片多少像素,则显示多大的图片
 9                     dd.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").sizingMethod = 'scale';
10                 }
11             </script>

1 <div  >
2                 <!--用于显示图片-->
3             </div>

最后附上批量上传时,后台的处理过程

 1 /// <summary>
 2     /// 保存图片到服务器
 3     /// </summary>
 4     /// <param name="sender"></param>
 5     /// <param name="e"></param>
 6     protected void btn_uploadFile_Click(object sender, EventArgs e)
 7     {
 8         string filePath = Server.MapPath("./") + "Pictures";
 9 
10         // 获取上传图片的集合
11         HttpFileCollection hfc = Request.Files;
12         for (int i = 0; i < hfc.Count; i++)
13         {
14             HttpPostedFile uHfc = hfc[i];
15             if (uHfc.ContentLength > 0)
16             {
17                 // 上传图片的文件名
18                 string fileName = uHfc.FileName;
19                 uHfc.SaveAs(filePath + "\\" + System.IO.Path.GetFileName(uHfc.FileName));
20 
21             }
22         }
23     }

以上东西,来自网上各种解答,只是我一次性遇到了这些问题,都在一篇里面搞定。如果还有什么其它问题,欢迎留言