在Save按钮的btnSave_Click事件处理程序中,FileUpload控件的HasFile属性用于检测文本框中是否输入了有效的完全限定文件名。如果文本框为空或输入的名称无效,将不会通过检测,并且lblMessage将显示“No file upladed”。
假定上传了一个有效文件,那么将执行try代码块中的代码。关键语句是调用File- Upload控件的SaveAs方法。该方法使用硬编码路径和FileName属性传递一个完全限定的文件名。该语句可能会由于各种原因而失败,包括磁盘空间不足、无效的路径或安全问题(稍后会有更详细的说明)。
如果SaveAs方法失败,则执行catch代码块。在lblMessage中显示一个错误信息,包括该异常的Message属性ex.Message。
如果SaveAs方法执行成功,关于上传文件的多个信息将显示在lblMessage中,这些信息通过FileUpload.PostedFile(类型为HttpPostedFile)中的属性获取。
Display按钮的Click事件处理程序与前面的类似,只不过它不是显示文件信息,而是显示文件内容。它通过使用FileContent属性获取表现为Stream对象的上传文件的内容,然后这个Stream对象被用于实例化一个StreamReader对象。StreamReader的Read- Line方法逐行的遍历文件,然后把合并后的字符串显示在lblDisplay中。
当在讨论从客户端上传文件到web服务器时,安全是非常让人关注的。须注意两点,首先,使用这种方式会公开web服务器,从而会有非常大的安全漏洞,为此要特别细心。因为这样不仅可以上传病毒,木马和其他恶意软件,还会存在客户端浏览web服务器目
录结构的危险。因此,应该使用硬编码目标目录,至少严格限定在哪里保存上传的文件。
另外,要注意的一点是,允许在磁盘写文件所必需的权限。在开发web应用程序时,一般情况下,开发机器同时也是web服务器,特别是使用VS2005默认的开发模式。在该模式下使用的是内置的web服务器,并且不通过IIS访问网站而是由文件系统访问网站。这样,永远也不会有权限问题。
然而,当网站部署到产品服务器上,且该网站通过IIS和虚拟目录来访问时,就会出现问题。这是因为运行ASP.NET的账户必须拥有对用于保存上传文件的目录的写权限。在Windows2000/XP中,账户的名称是ASPNET。在Windows Server2003中,写权限必须分配给IIS_WPG账户组。
利用FileUpload控件并结合良好的安全防护,用户可以把自己的文件传送到网站,以丰富网站功能。
下面就是FileUpload控件:
<div>
<asp:FileUpload ID="fulFile" runat="server" οnchange="PreviewImg(this)" />
<asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" Text="上传" />
</div>
这里的层用来预览图片:
<div id="newPreview"></div>
因为安全性问题,IE7禁用了image控件引用本地图片,以下是解决方案
在<head></head>之间添加如下代码:
<style type="text/css">
#newPreview {
FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)
}
</style>
<script language="javascript" type="text/javascript">
function PreviewImg(imgFile)
{
var newPreview = document.getElementById("newPreview");
newPreview.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgFile.value;
newPreview.style.width = "800px";
newPreview.style.height = "720px";
}
</script>
btnUpload click 事件:
protected void btnUpload_Click(object sender, EventArgs e)
{
string path = Server.MapPath("~/Image/");
if (this.fulFile.HasFile)
{
string fileException = System.IO.Path.GetExtension(fulFile.FileName).ToLower();
if (fileException.Equals(".jpg"))
{
this.fulFile.SaveAs(path + fulFile.FileName);
Response.Write("<script>alert('上传成功!');</script>");
Response.Write("文件路径:"+this.fulFile.PostedFile.FileName+" "
+this.fulFile.PostedFile.ContentLength+"字节 MIME内容类型:"
+this.fulFile.PostedFile.ContentType);
}
else
{
Response.Write("<script>alert('上传失败!仅支持JPG格式的图片');</script>");
}
}
else
{
Response.Write("<script>alert('请选择文件!');</script>");
}
}
protected void Button2_Click(object sender, EventArgs e)
{
if(UpLoadPic())
{
Response.Write(FileUpload1.PostedFile.FileName.ToString());
}
}
private string[] AcceptedFileTypes = new string[] { "jpg", "jpeg", "jpe" ,"png","p2p"};
public bool UpLoadPic()//上传
{
bool ifSucess = false;
if (FileUpload1.PostedFile.ContentLength > 0)
{
if (IsValidFileType(FileUpload1.PostedFile.FileName))
{
if (FileUpload1.PostedFile.ContentLength < 1024 * 2000)
{
string fullName = FileUpload1.PostedFile.FileName;
string newName = System.DateTime.Now.ToString("yyyyMMddhhmmss") + fullName.Substring(fullName.LastIndexOf("."));
string path = Server.MapPath("UpLoad");
FileUpload1.SaveAs(path + "/" + newName);
Label1.Text = newName;
Image1.ImageUrl = "UpLoad/" + newName;
Image1.Visible = true;
ifSucess = true;
}
else
{
Response.Write("<script>alert('出错了!上传文件太大!')</script>");
}
}
else
{
ifSucess = false;
Response.Write("<script>alert('出错了!上传文件格式不对!')</script>");
}
}
else
{
Response.Write("<script>alert('出错了!上传文件不能为空!')</script>");
}
return ifSucess;
}
private bool IsValidFileType(string FileName)//图片格式检验
{
string ext = FileName.Substring(FileName.LastIndexOf(".") + 1, FileName.Length - FileName.LastIndexOf(".") - 1);
for (int i = 0; i < AcceptedFileTypes.Length; i++)
{
if (ext.ToLower() == AcceptedFileTypes[i])
{
return true;
}
}
return false;
}