zoukankan      html  css  js  c++  java
  • Webfrom 上传 单个上传 多个上传

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

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

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

    3.FileBytes属性:上传文件的内容,即二进制数据。

    场景:
    一、单文件上传到服务器硬盘
    最简单的上传:
    string path = Server.MapPath( "uploads/aaa.txt"); //需要路径映射
    FileUpload1.SaveAs(path);
    问题:所有上传文件都叫aaa.txt。如何保持文件原有的名子?

    优化一:使用FileUpload的FileName属性,获取出上传文件的客户端的名子。
    string fileName = FileUpload1.FileName; //取得文件上传之间在客户端的名子。
    string path = Server.MapPath("uploads/" + fileName);
    FileUpload1.SaveAs(path);
    问题:如果不同用户上传同一文件名的文件,如何避免覆盖?
    优化二:不同用户,在同是时间传相同的文件名。
    在文件名中使用用户名加以区分:
    string fileName = DateTime.Now.ToString("yyyyMMddhhmmss") +Session["user"].ToString() + FileUpload1.FileName; //取得文件上传之间在客户端的名子。
    string path = Server.MapPath("uploads/" + fileName);
    FileUpload1.SaveAs(path);
    问题:上传文件大于4M就会报错。 //默认上传文件的最大大小是4096K
    优化三:扩容。
    在Web.Config中配置上传请求的最大长度。
    <system.web>
    <httpRuntime maxRequestLength="40960"/> //默认是4096
    </system.web>

    作业:回去查找资源:C#如何上传大文件?

    二、多文件上传到服务器硬盘
    (一)简单实现:
    思路:遍历页面Form中的每个控件,判断是否是FileUpload,如果是的话就把它强制转化为FileUpload类型,再按单文件上传逐个上传即可。
    int i = 1; //上传文件的流水号
    foreach (Control ctrl in this.form1.Controls) //遍历Form中的每个控件
    {
    if (ctrl is FileUpload) //看一下ctrl 对象是不是FileUpload类型
    {
    FileUpload file = (FileUpload)ctrl; //强制转化为FileUpload类型

    //单文件上传的代码
    string fileName = DateTime.Now.ToString("yyyyMMddhhmmssms") +i.ToString("0000") + file.FileName;
    string path = Server.MapPath("uploads/" + fileName);
    file.SaveAs(path);

    i++;
    }
    }
    问题:没有选择上传文件的也会在服务器端生成一个0k的文件。

    (二)优化:把没有选择上传文件的给跳过去.
    int i = 1;
    foreach (Control ctrl in this.form1.Controls)
    {
    if (ctrl is FileUpload) //看一下ctrl 对象是不是FileUpload类型
    {
    FileUpload file = (FileUpload)ctrl;

    if (file.HasFile) //判断每个控件中是否选择了上传的文件。
    {
    string fileName = DateTime.Now.ToString("yyyyMMddhhmmssms") + i.ToString("0000") + file.FileName;
    string path = Server.MapPath("uploads/" + fileName);
    file.SaveAs(path);

    i++;
    }
    }
    }
    三、上传文件到数据库的Image字段
    第一步:把文件的二进制数据取出来。FileUpload1.FileBytes (byte[])
    第二步:送到数据库中去。 //ADO.NET或Linq2Sql


    四、从数据库中的Image字段中取出来,显示在页面上。
    1.选做一个显示图片的页面。例如:ShowPic.aspx.
    这个页面根据传来的主键值,查询出图片数据,并Response.OutputStream显示在界面。
    protected void Page_Load(object sender, EventArgs e)
    {
    if (Request["id"] != null)
    {
    string index = Request["id"].ToString();
    //主要做是:
    //1.读取某一条Photo表的数据记录。
    var query = _Context.Photo.Where(p => p.Ids.ToString() == index);
    Photo data = query.First();
    byte[] pic = data.Content.ToArray();
    //2.把二进制数据直接输出到界面上。
    Response.OutputStream.Write(pic, 0, pic.Length); //向输出流里输出二进制数据
    Response.End();
    }
    }
    2.在另一个界面上,放一个Image控件,让该Image控件的ImageUrl指向上面的那个页面,并传指定的值过去。
    HTML代码: 
    <asp:DropDownList ID="DropDownList1" runat="server">
    </asp:DropDownList>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="显示" />
    <br />
    <asp:Image ID="Image1" runat="server" />
    C#代码:
    //填充下拉列表.略
    //“显示”按钮上的代码
    protected void Button1_Click(object sender, EventArgs e)
    {
    Image1.ImageUrl = "ShowPic.aspx?id=" + DropDownList1.SelectedValue;
    }


    如何做验证吗?
    思路:
    1.也是需要两个页面。一个页面是用来画验证码的;另外一个页面是用来展现文本框和验证验的。
    2.使用画图技术中的知识点,画随机数图片。随机数需要事选保存在Session中,检查验证码是否正确就要使用session中的值进行对比。
    3.点击验证码刷新如何实现?
    function dochange(img) {
    var temp = Math.random(); //JS生成随机数的代码。
    img.setAttribute("src","yzm.aspx?id="+temp);
    }

    作业:找C#生成验证码的代码。

  • 相关阅读:
    HP惠普战66电源黄灯闪烁无法充电
    C#.NET rabbit mq 持久化时报错 durable
    手动解压安装mysql8.0 on windows my.ini
    C#.NET MySql8.0 EF db first
    EF MYSQL 出现:输入字符串的格式不正确
    EF MYSQL DB FIRST 出现2次数据库名
    mysql windows 下配置可远程连接
    团队项目的Git分支管理规范
    一个简单的软件测试流程
    微服务架构下的质量迷思——混沌工程
  • 原文地址:https://www.cnblogs.com/tianxuan/p/4738631.html
Copyright © 2011-2022 走看看