WebForm之FileUpload控件(文件上传)

时间:2023-12-01 21:42:44

FileUpload控件要与Button、LinkButton、ImageButton配合使用

FileUpload控件的方法及属性:

1、SaveAs("要上传到服务器的绝对路径")方法:用来上传文件

注:一般使用Server.MapPath()方法进行相对路径与绝对路径之间的转换。

2、FileName属性:要上传文件的文件名,不带路径

3、PostedFile.ContentLength属性:获得上传文件的字节长度,除以1024,得到KB

<一>最简单的上传

//点击上传
protected void Button1_Click(object sender, EventArgs e)
{
  string path=Server.MapPath("uploads/aaa.doc");//需要路径映射
  FileUpload1.SaveAs(path);//此方法需要绝对路径
}

问题:所有上传文件都叫同一个名

》》优化一:使用FileUpload的FileName属性,获取上传文件的客户端的名字

string fileName = FileUpload1.FileName;//获取文件的客户端的名字
string path = Server.MapPath("uploads/" + fileName);
FileUpload1.SaveAs(path);

问题:如果不同用户在同一时间上传同一文件名的文件,应该避免文件的覆盖

》》优化二:解决不同用户同一时间上传同一文件名的情况(在文件名中使用用户名加以区分)

if (Session["user"] != null)
{
  string fileName = DateTime.Now.ToString("yyyyMMddmmss")+Session["user"].ToString()+ FileUpload1.FileName;

//在文件名中加上时间和用户名
  string path = Server.MapPath("uploads/" + fileName);
  FileUpload1.SaveAs(path);
}

else
{
  Response.Redirect("Default2.aspx");
}

问题:上传文件大于4M,程序会报错。系统默认的文件最大为4M,也就是4096K

》》优化三:扩容

在Web.Config中配置上传请求的最大长度

<system.web>
<compilation debug="true" targetFramework="4.5.1"/>
<httpRuntime maxRequestLength="10240" />//扩容也不要太大,空值在10M以内为佳
</system.web>

<二、多文件上传到服务器硬盘>

#简单实现:

思路:遍历页面Form中的每个控件,判断是否是FileUpload,如果是的话就把她强制转化成FileUpload类型,再按单文件上传逐个上传即可

if (Session["user"] != null)
{

int i = 1;//文件上传的流水号
foreach (Control ctrl in this.form1.Controls)//遍历this(这个页面)中的form1(表单1这个类中的)Controls(所有控件),其中包含了按钮之类,要排除在外
{
if (ctrl is FileUpload)//判断是否是FileUplaod类型
{
FileUpload file = (FileUpload)ctrl;//如果是FileUpload类型,就强制转化一下
//以下还是上传单文件的步骤
string fileName = DateTime.Now.ToString("yyyyMMddmmss") + Session["user"].ToString() + i.ToString("0000") + file.FileName;
string path = Server.MapPath("uploads/" + fileName);
FileUpload1.SaveAs(path);
}
i++;//自增
}

问题:没有选择上传的文件也会在服务器端生成一个0KB的文件如图

WebForm之FileUpload控件(文件上传)             WebForm之FileUpload控件(文件上传)

》》优化:把没有选择上传的给跳过去

if (Session["user"] != null)
{
int i = 1;//文件上传的流水号
foreach (Control ctrl in this.form1.Controls)//遍历this(这个页面)中的form1(表单1这个类中的)Controls(所有控件),其中包含了按钮之类,要排除在外
{
if (ctrl is FileUpload)//判断是否是FileUplaod类型
{
FileUpload file = (FileUpload)ctrl;//如果是FileUpload类型,就强制转化一下
if (file.HasFile)//判断是否有文件,没有就跳过
{
//以下还是上传单文件的步骤
string fileName = DateTime.Now.ToString("yyyyMMddmmss") + Session["user"].ToString() + i.ToString("0000") + file.FileName;
string path = Server.MapPath("uploads/" + fileName);
FileUpload1.SaveAs(path);
}
}
i++;//自增
}