• 奇怪的母版页里面的 form 表单里面的 enctype="multipart/formdata" html控件上传 FileUpload控件上传 一次多图片上传


    在一般情况下,我的母版页的form表单是没有 enctype="multipart/form-data",例如

    image

    如果是子页面引用了母版页,那么出来的页面,是这个样子,还是没有刚才那一串字符的

    image

    但是,假如我在子页面的头部里面,假如加了一点js代码,他就会多出 enctype="multipart/form-data"  了

    上面这句话,是错的

    我原本以为我上面的这句话是对的,但是后来发现,asp.net 会判断你的页面里面有没有 

    <asp:FileUpload ID="fileUpload" runat="server" /> 这样的服务器端上传控件,如果有,他就会帮你加上一个 enctype="multipart/form-data"  ,但是有时候,asp.net 不是很智能,如果你写的是 html 版本的

    <input id="File1" type="file">    ,然后.net 在编译之后居然不会帮你加上  enctype="multipart/form-data"

    造成的问题就是,你通过 HttpFileCollection uploadFiles = Request.Files;  来获取上传的值的时候,会提示你,这个对象未引用,也就是,根本就没有找到这个 HttpFileCollection  对象

    实际上,如果你页面上每个页面都加上   enctype="multipart/form-data"   ,也不会有任何问题。所以加上为好。

    附加:asp.net   html控件(非服务器控件)上传图片,FileUpLoad 控件(服务器控件)上传图片的演示

    1:http://www.cnblogs.com/qiantuwuliang/archive/2009/08/21/1551200.html

    对于 ASP.NET 的服务器端控件 FileUpload 来说,可以直接用 FileUpload1.PostedFile 这样的代码来获取上传文件框的文件。

    但如果我们没有用 FileUpload,而直接用的 <input type="file" name="pic1" /> 这样的 HTML 控件,ASP.NET 又如何取这些内容呢?

      用 Request.Files。

      • Request.Files.Count 客户端传了多少文件过来。此时不论我们使用的是服务端控件还是 HTML 控件,因为到了客户端都是一样的 <input type="file";另外,即使文件上传框中没有选择文件,都可能会当作上传了无内容的文件(视客户端浏览器)。
      • Request.Files[i].ContentLength 获取上传文件的大小,以字节为单位。
      • Request.Files[i].ContentType 获取客户端发送的文件的 MIME 内容类型。
      • Request.Files[i].FileName
      • Request.Files[i].InputStream
      • Request.Files[i].SaveAs(string filename)

      上面的 Request.Files[i],也可以是 Request.Files[name]。

    ===============================================================

    一直以为只有file框,只有在使用了runat="server"后才可以实现上传文件的功能。
    如:
       <form id="form1" method="post" runat="server">
           <input id="File1" type="file" name="File1"/>
           <input id="Submit1" type="submit" value="submit" />
       </form>

    其实,这只是一个误区,在.net中file框也可以不使用runat="server"也可以实现上传文件的功能。如:
       <form id="form1" method="post" enctype="multipart/form-data" action="d.aspx">
           <input id="File1" type="file" name="File1"/>
           <input id="Submit1" type="submit" value="submit" />
       </form>

    从代码可以看出区别。如果file框没有加runat="server",则form里一定要加上

    enctype="multipart/form-data"这样才可以实现上传文件到服务器。

    同时可以看到第一个form中使用了runat="server"。而第二个没有。其实使用了server和没有使用

    runat="server"是有区别的.使用了runat="server"的form编译后,action必定是指向本身的网页。而没

    有加runat="server"的form可以指向一个网页。这样就可以实现异文件上传------与asp的上传方法相似

    ,但是代码就简便许多。

    异文件上传的处理代码如下:
    d.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class d : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Files.Count>0)
            {
                HttpPostedFile f = Request.Files[0];
                f.SaveAs(Server.MapPath("002.jpg"));
            }
        }
    }

    结论:request.files可以实现文件上传的两种方法。并且文件上传的两种方法,在代码页上是没有什么

    区别的,重点是在在设计器上。关闭式(runat=server)方法,file框一定要加上runat=server,form也

    是一定要加上runat=server。开放式(submit form)则file框和form都不加runat=server,即写成纯html

    代码!!!(所以在form中加入method=post enctype="multipart/form-data")。

     

     

    ============================= 附加自己用的时候 的代码  多图片上传============================================

    image

    前台有多个 上传框,是用rep来循环生成的。如果是用 FileUpload 的话,那么生成的ID和name都无法掌握,所以前台用的html上传空间

     <asp:Repeater ID="rep" runat="server">
                        <ItemTemplate>
                        <tr>
                            <td style="border-right: 1px solid #ccc;" class="style1" align="right">
                                <%#Eval("size") %></td>
                            <td style="border-right: 1px solid #ccc;" class="style6">
                                <input id="File1" type="file"  name='upload<%#Eval("size") %>'/>
                              </td>
                        </tr>
                        </ItemTemplate>
                        </asp:Repeater>
    

     

     

    下面是点击保存之后的后台代码

    List<Model.Pictype> pictypemodel = new DAL.PictypeDAO().GetListArray("");//获取所有的图片分辨率
                    HttpFileCollection uploadFiles = Request.Files;//获取所有的上传的个数,判断上传的图片个数是不是和图片分辨率的种类相同
                    if (pictypemodel.Count != uploadFiles.Count)
                    {
                        Joey.Utility.Tool.Alert("请上传全部图片", this.Page);
                        return;
                    }
                    else
                    {
                        for (int i = 0; i < uploadFiles.Count; i++)
                        {
                            if (string.IsNullOrEmpty(uploadFiles[i].FileName))
                            {
                                Joey.Utility.Tool.Alert("请上传完全部图片", this.Page);
                                return;
                            }
                        }
     
                    }
    
                    DateTime start = DateTime.Now;
                    string[] allowExtensions = { ".jpg", ".png", ".bmp", ".jpeg", ".gif" };
    
                    //先临时把图片保存到图片集合里面
                    List<Model.Pic> piclist = new List<Pic>();
                    
                    for (int i = 0; i < pictypemodel.Count; i++)
                    {
                        string name = "upload" + pictypemodel[i].Size; //获取上传的客户端的 name  ,有了name 就能和 数据库里面的size进行匹配
    
                        //保存图片,并且返回图片的路径
                        string tempurl = "";
                        try
                        {
                            tempurl = Joey.Utility.Tool.HtmlUpload(uploadFiles[name], allowExtensions, 10, Server.MapPath("images/"));
                        }
                        catch (Exception ex)
                        {
                            Joey.Utility.Tool.Alert(ex.Message, this.Page);
                            return;
                        }
    
                        //插入图片集合中
                        piclist.Add(new Pic() { PicTypeId = pictypemodel[i].PicTypeId, PicUrl = tempurl });
                    }
    
    
                    //最后,添加广告,获取到广告的ID,修改图片实体类的ID,把图片集一起插入数据库
                    int id;
                    itemdao.Add(new Model.Item() { Title = title, Href = href, Status = status, StartTime = start, HitCount = 0 }, out id);
                    DAL.PicDAO picdao = new DAL.PicDAO();//图片操作类
                    for (int i = 0; i < piclist.Count; i++)
                    {
                        piclist[i].AdId = id;
                        picdao.Add(piclist[i]);
                    }
                    CommDAO.AddRecord(int.Parse(User.Identity.Name), "新增广告添加成功,广告标题:" + title, Request.UserHostAddress);
                    Joey.Utility.Tool.AlertAndGo("添加成功!", "adlist.aspx", this.Page);
    
                }
    

    最后是上传的代码

    /// <summary>Html上传
            /// 
            /// 
            /// </summary>
            /// <param name="file">通过html控件上传的文件</param>
            /// <param name="allowExtensions">允许上传的扩展文件名类型,如:string[] allowExtensions = { ".doc", ".xls", ".ppt", ".jpg", ".gif" };</param>
            /// <param name="maxLength">允许上传的最大大小,以M为单位</param>
            /// <param name="savePath">保存文件的目录,注意是绝对路径,如:Server.MapPath("~/upload/");</param>
            /// <returns></returns>
            public static string HtmlUpload(HttpPostedFile file, string[] allowExtensions, int maxLength, string savePath)
            {
                // 文件格式是否允许上传
                bool fileAllow = false;
                if (file.ContentLength/ 1024 / 1024 >= maxLength)
                {
                    throw new Exception("只能上传小于" + maxLength + "M的文件!");
                }
                //取得上传文件之扩展文件名,并转换成小写字母
                string fileExtension = System.IO.Path.GetExtension(file.FileName).ToLower();
                string tmp = "";   // 存储允许上传的文件后缀名
                //检查扩展文件名是否符合限定类型
                for (int i = 0; i < allowExtensions.Length; i++)
                {
                    tmp += i == allowExtensions.Length - 1 ? allowExtensions[i] : allowExtensions[i] + ",";
                    if (fileExtension == allowExtensions[i])
                    {
                        fileAllow = true;
                    }
                }
    
                if (fileAllow)
                {
                    try
                    {
                        string datedir = DateTime.Now.ToString("yyyyMMdd");
                        if (!Directory.Exists(savePath + datedir))
                        {
                            Directory.CreateDirectory(savePath + datedir);
                        }
                        string saveName = Guid.NewGuid() + fileExtension;
                        string path = savePath + datedir + "/" + saveName;
                        //存储文件到文件夹
                        file.SaveAs(path);
                        return datedir + "/" + saveName;
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                else
                {
                    throw new Exception("文件格式不符,可以上传的文件格式为:" + tmp);
                }
            }
    
  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/joeylee/p/2718683.html
Copyright © 2020-2023  润新知