zoukankan      html  css  js  c++  java
  • 奇怪的母版页里面的 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);
                }
            }
    
  • 相关阅读:
    并发运行的思维模型
    进程和线程的区别
    拿来主义
    同步组件合作和团队合作 让世界变得更美好
    strace a++;b++;a+b;
    System 88: GDB Overview
    numpy多维数组维度及添加轴的理解
    Numpy入门
    python列表list 和numpy.array区别
    数组的生成方法
  • 原文地址:https://www.cnblogs.com/joeylee/p/2718683.html
Copyright © 2011-2022 走看看