1.FileUpload 控件介绍
FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器。用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles\test.txt)来指定要上载的文件。用户也可以通过单击“浏览”按钮,然后在“选择文件”对话框中定位文件来选择文件。
用户选择要上载的文件后,FileUpload 控件不会自动将该文件保存到服务器。必须显式提供一个控件或机制,使用户能提交指定的文件。例如,可以提供一个按钮,用户单击它即可上载文件。为保存指定文件所写的代码应调用 SaveAs 方法,该方法将文件内容保存到服务器上的指定路径。通常,在引发回发到服务器的事件的事件处理方法中调用SaveAs 方法。
在文件上传的过程中,文件数据作为页面请求的一部分,上传并缓存到服务器的内存中,然后再写入服务器的物理硬盘中。
2.FileUpload 控件属性介绍
1)FileUpload控件常用的几个公开的只读属性
名 称 | 返回类型 | 说 明 |
FileContent | Stream | 返回一个指向上传文件的Stream流对象 |
FileName | string | 返回上传文件在客户端的文件名称,不包含路径信息 |
HasFile | Boolean | 获取一个布尔值,用于表示FileUpload控件是否已经包含一个文件 |
PostedFile | HttpPostedFile | 获取一个与上传文件相关的HttpPostedFile对象,使用该对象可以获取上传文件的相关属性。下表列出了它所公开的只读属性 |
2)HttpPostedFile属性
名 称 | 返回类型 | 说 明 |
ContentLength | integer | 返回上传文件的按字节表示的文件大小 |
ContentType | string | 返回上传文件的MIME内容类型 |
FileName | string | 返回文件在客户端的完全限定名 |
InputStream | Stream | 返回一个指向上传文件的流对象 |
3.注意
1)确认是否包含文件
在调用 SaveAs 方法将文件保存到服务器之前,使用HasFile 属性来验证FileUpload 控件确实包含文件。若HasFile 返回true,则调用SaveAs 方法。如果它返回false,则向用户显示消息,指示控件不包含文件。不要通过检查PostedFile 属性来确定要上载的文件是否存在,因为默认情况下该属性包含 0 字节。因此,即使FileUpload 控件为空,PostedFile 属性仍返回一个非空值。
2)文件上传大小限制
默认情况下,上传文件大小限制为 4096 KB (4 MB)。可以通过设置 httpRuntime 元素的maxRequestLength 属性来允许上载更大的文件。
相关节点如下:
〈system.web>
〈httpRuntime maxRequestLength="40690" executionTimeout="6000" />
〈/system.web>
maxRequestLength表示可上传文件的最大值,executionTimeout表示ASP.NET关闭前允许发生的上载秒数。
若要增加整个应用程序所允许的最大文件大小,请设置 Web.config 文件中的 maxRequestLength 属性。若要增加指定页所允许的最大文件大小,请设置 Web.config 中location 元素内的maxRequestLength 属性。
上载较大文件时,用户也可能接收到以下错误信息:
was recycled because memory consumption exceeded 460 MB (60 percent of available RAM).
以上信息说明,上传文件的大小不能超过服务器内存大小的60%。这里的60%是Web.config文件的默认配置,是<processModel>配置节中的memoryLimit 属性默认值。虽然可以修改,但是如果上传文件越大,成功几率越小,不建议使用。
3)上传文件夹的写入权限
应用程序可以通过两种方式获得写访问权限。您可以将要保存上载文件的目录的写访问权限显式授予运行应用程序所使用的帐户。您也可以提高为 ASP.NET 应用程序授予的信任级别。若要使应用程序获得执行目录的写访问权限,必须将AspNetHostingPermission 对象授予应用程序并将其信任级别设为AspNetHostingPermissionLevel.Medium 值。提高信任级别可提高应用程序对服务器资源的访问权限。请注意,该方法并不安全,因为如果怀有恶意的用户控制了应用程序,他(她)也能以更高的信任级别运行应用程序。最好的做法就是在仅具有运行该应用程序所需的最低特权的用户上下文中运行 ASP.NET 应用程序。
4.可以通过3种方法访问上传文件
1)通过FileBytes属性。该属性将上传文件数据置于字节数组中,遍历该数组,则能够以字节方式了解上传文件的内容。
2)通过FileContent属性。调用该属性可以获得一个指向上传文件的Stream对象。可以使用该属性读取上传文件数据,并使用FileBytes属性显示文件内容。
3)通过PostedFile属性。调用该属性可以获得一个与上传文件相关的HttpPostedFile对象,使用该对象可以获得与上传文件相关的信息。例如,调用HttpPostedFile对象的ContentLength,可以获得上传文件大小;调用HttpPostedFile对象ContentType属性,可以获得上传文件的类型;调用HttpPostedFile对象的FileName属性,可以获得上传文件在客户端的完整路径(调用FileUpload控件的FileName属性,仅能获得文件名)。
5.FileUpload控件上传简单实例
<ul class="examine_info" style=" margin:10px auto;">
<li>
<span style=" display:inline-block; float:left; font-family:微软雅黑; font-size:16px;">上传附件:</span>
<div class="file_box" style=" float:left;">
<input id="btnPicUp" class="file" style=" border:0; background-color:transparent;" type="button" runat="server" οnclick="document.getElementById('fuFile').click();" value ="点击这里上传真实发票"/>
</div>
<span style=" display:inline-block; float:left; font-family:微软雅黑; font-size:16px;">
<asp:FileUpload ID="fuFile" οnchange="javascript:__doPostBack('lbUploadFile','')" runat="server" Height="30px" Width="160px" BorderStyle="None" style="display:none" />
<asp:LinkButton ID="lbUploadFile" runat="server"></asp:LinkButton>
<asp:Label runat="server" ID="lblUploadResult" Text="" ForeColor="Green"></asp:Label>
<asp:Label runat="server" ID="lblUploadFileName" Visible="false"></asp:Label>
<!-- 使用UpdatePanel是为了防止页面刷新,FiileUpload所选文件丢失 -->
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode = "Conditional">
<ContentTemplate>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="lbUploadFile" />
</Triggers>
</asp:UpdatePanel>
</span>
</li>
</ul>
(2).cs
/// <summary>
/// 上传文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void lbUploadFile_Click(object sender, EventArgs e)
{
try
{
string strfileName = "";
if (fuFile.HasFile)
{
Boolean fileOK = false;
string strfileExtension = System.IO.Path.GetExtension(fuFile.FileName).ToLower();//文件后缀名
string strFileType = fuFile.PostedFile.ContentType;
string strUploadPath = SysConfig.PaperFilePhysicalPath;
String[] allowedExtensions = { ".xls", ".doc", ".txt", ".ico", ".docx", ".xlsx", ".pdf", ".gif", ".bmp", ".jpge", ".jpg", ".rar", ".zip", ".flv", ".swf", ".rm", ".ppt", ".pptx", ".png" };
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (strfileExtension == allowedExtensions[i])
{
fileOK = true;
break;
}
}
if (fileOK)
{
if (!System.IO.Directory.Exists(strUploadPath))//判断文件夹是否已经存在
{
System.IO.Directory.CreateDirectory(strUploadPath);//创建文件夹
}
strfileName = Guid.NewGuid().ToString().Replace("-","") + "_" + fuFile.FileName;
fuFile.PostedFile.SaveAs(strUploadPath + "\\" + strfileName);
lblUploadResult.Text = "文件[" + fuFile.FileName + "]上传成功!";
lblUploadFileName.Text = strfileName;
PaperAttachment objPaperAttachment = new PaperAttachment();
objPaperAttachment.AttachName = strfileName;
objPaperAttachment.PhysicalPath = SysConfig.PaperFilePhysicalPath + strfileName ;
objPaperAttachment.FilePath = SysConfig.PaperFilePath + strfileName ;
objPaperAttachment.FileSize = fuFile.PostedFile.ContentLength;
objPaperAttachment.FileType = strfileExtension;
objPaperAttachment.ServerId = SysConfig.ServerId;
ViewState["PaperAttachment"] = objPaperAttachment;
}
else
{
lblUploadResult.Text = "不能接受这种文件类型,请重新选择文件!";
return;
}
}
else
{
BootStrap.AlertErrorToUpdatePanel(this.Page, "请选择文件");
}
}
catch (Exception err)
{
BootStrap.AlertErrorToUpdatePanel(this.Page, err.Message);
}
}
2)一次上传多个文件
要一次上传多个文件,我们可以像传单个文件那样对每个文件单独进行处理,除此之外,我们还可以使用HttpFileCollection类捕获从Request对象发送来的所有文件,然后再单独对每个文件进行处理.
(1).cs
protected void Button1_Click(object sender, EventArgs e)
{
string filepath = Server.MapPath("upload") + "\\\\";
HttpFileCollection uploadFiles = Request.Files;
for (int i = 0; i 〈 uploadFiles.Count; i++)
{
HttpPostedFile postedFile = uploadFiles[i];
try
{
if (postedFile.ContentLength > 0)
{
Label1.Text += "文件 #" + (i + 1) + ":" + System.IO.Path.GetFileName(postedFile.FileName) + "〈br/>";
postedFile.SaveAs(filepath + System.IO.Path.GetFileName(postedFile.FileName));
}
}
catch (Exception Ex)
{
Label1.Text += "发生错误: " + Ex.Message;
}
}
}