文件上传

一、单文件上传

控件:
FileUpload - 控件,界面+方法+属性
Button/LinkButton/ImageButton

FileUpload控件:
1.SaveAs("要上传到服务器的绝对路径") 方法:上传文件。
般需要使用Server.MapPath()进行相对路径与绝对路径之间的转换。

    protected void Button1_Click(object sender, EventArgs e)
    {
        string path = Server.MapPath("Upload/aaa.txt");//需要路径映射
        FileUpload1.SaveAs(path);
    }

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

问题:所有上传文件都叫aaa.txt。如何保持文件原有的名子?

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

    protected void Button1_Click(object sender, EventArgs e)
    {
        string filename = FileUpload1.FileName; //取得文件上传之前在客户端的名字
        string path = Server.MapPath("Upload/"+ filename);
        FileUpload1.SaveAs(path);
    }

优化二:不同用户,在同一时间传相同的文件名,在文件名中使用用户名加以区分:

//新建一个登录界面
   protected void Button1_Click(object sender, EventArgs e)
    {
        //若用户登陆成功,跳转到上传界面
        if (true)
        {
            Session["user"] = TextBox1.Text;
            Response.Redirect("Default.aspx");
        }

    }
//再上传界面判断
 protected void Page_Load(object sender, EventArgs e)
    {
        //判断登陆用户是不是为空,如果为空跳转到登录界面
        if (Session["user"] == null)
        {
            Response.Redirect("Index.aspx");
        }
    }
//上传
  protected void Button1_Click(object sender, EventArgs e)
    {
        string filename = DateTime.Now.ToString ("yyyyMMddhhmmss")+ Session["user"].ToString ()+  FileUpload1.FileName; 
        string path = Server.MapPath("Upload/"+ filename);
        FileUpload1.SaveAs(path);
    }

优化三:扩容

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

    <system.web>
        <httpRuntime maxRequestLength="40960"/>
    </system.web>

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

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

    protected void Button1_Click(object sender, EventArgs e)
    {
        //定义一个流水号
        int i = 1;
        //遍历form中的每个控件
        foreach (Control ctrl in this.form1.Controls )
        {
            //ctrl对象是不是FileUpload类型
            if (ctrl is FileUpload) //判断每个控件中是否选择了上传的文件
            {
                //强制转换为FileUpload类型
                FileUpload file = (FileUpload)ctrl;
                if (file.HasFile)
                {
                    //取出文件名
                    string filename = DateTime.Now.ToString("yyyyMMddhhmmss") + i.ToString("0000") + file.FileName;
                    string path = Server.MapPath("Upload/" + filename);
                    file.SaveAs(path);
                    i++;
                }
            }
        }
    }

三、上传文件到数据库的Image字段:

    protected void Button1_Click(object sender, EventArgs e)
    {
        //把界面的数据取出来
        string filename = FileUpload1.FileName;//取文件名
        byte[] content = FileUpload1.FileBytes;//把上传文件的数据取出来
        //送到数据库中去
        Photo data = new Photo();//建一个新对象
        data.FileName = filename; //上传上来的文件名
        data.Content = content; //接收上传文件的数据

        _Context.Photo.InsertOnSubmit(data);
        _Context.SubmitChanges();
    }

四、从数据库中的Image字段中取出来,显示在页面上

1.选做一个显示图片的页面。例如:ShowPic.aspx.
这个页面根据传来的主键值,查询出图片数据,并Response.OutputStream显示在界面。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request["id"] != null)
        {
            string Index = Request["id"].ToString();

            //读取一条Photo表的数据
            var query = _Context.Photo.Where(p => p.Ids.ToString() == Index);
            Photo data = query.First();
            byte[] pic = data.Content.ToArray();

            //把二进制数据输出到界面上
            Response.OutputStream.Write(pic, 0, pic.Length);//向输出流里输出二进制数据
            Response.End();
        }
    }

2.在另一个界面上,放一个Image控件,让该Image控件的ImageUrl指向上面的那个页面,并传指定的值过去。

public partial class Default3 : System.Web.UI.Page
{
    private MyDBMDataContext _Context = new MyDBMDataContext();
    //绑定数据
    private void FillPic()
    {
        List<Photo> list = _Context.Photo.ToList();
        DropDownList1.DataSource = list;
        DropDownList1.DataTextField = "FileName";
        DropDownList1.DataValueField = "Ids";
        DropDownList1.DataBind();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillPic();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Image1.ImageUrl = "ShowPic.aspx?id=" + DropDownList1.SelectedValue;
    }
}