<form id="form1" runat="server" enctype="multipart/form-data" >
    <div>
        <p id="pFileList"><input type="file"  size="50" name="file" id="hello"/></p>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </div>
    </form>protected void Button1_Click(object sender, EventArgs e)
    {
        HttpFileCollection hc = HttpContext.Current.Request.Files;
        Response.Write(hc.Count);
        string url = Request.Form["file"];
        Response.Write(url);
        int loop1;
        NameValueCollection coll;        //Load Form variables into NameValueCollection variable.
        coll = Request.Form;
        // Get names of all forms into a string array.
        String[] arr1 = coll.AllKeys;
        for (loop1 = 0; loop1 < arr1.Length; loop1++)
        {
            Response.Write("Form: " + arr1[loop1] + "<br>");
        }
    }需要加using System.Collections.Specialized;以上是我代码,我说下问题,我在页面上有HttpFileCollection来获取页面上的浏览控件
如果enctype属性是"multipart/form-data",则HttpFileCollection能获得页面上浏览控件的引用,但Request.Form["file"]不能得到浏览控上的值,(注意是值不是引用)
如果enctype属性改成另外两种,Request.Form["file"]能得到浏览控上的值,HttpFileCollection却不能获得页面上浏览控件的引用,
我查了MSDN,上面说的当enctype属性为multipart/form-data 或者application/x-www-form-urlencoded 时,Request.Form能被填充,我试了不行,这是为什呢? 

解决方案 »

  1.   

    当enctype属性为multipart/form-data 时Request.Form里是不会有File的值的
    而必须使用Request.Files才能收集,同时可以收集到上传的文件内容如果enctype为application/x-www-form-urlencoded 时
    Request.Form里是有File的值,但是不能得到上传的文件内容。
      

  2.   

    另外MSDN上只有如下信息,没有找到你看到的信息:
    使用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。下表显示通用的编码类型。编码类型 
     说明 
     
    application/x-www-form-urlencoded 
     窗体数据被编码为名称/值对。这是标准的编码格式。 
     
    multipart/form-data 
     窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 
     
    text/plain 
     窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 
     
      

  3.   

    没有,你可以参考Http协议
    http://www.w3.org/TR/html401/interact/forms.html#adef-enctype
      

  4.   

    刚才我用另外办法解决了,和大家分享下
     ////////////////////////////////////////////////////////////////////////////////////////
            /// <summary>
            /// 得到上传文件的名字集合数组
            /// </summary>
            /// <param name="files">该页面的所有上传对象的集合</param>
            /// <returns>返回文件名的集合数组</returns>
            public static string[] GetFileName(HttpFileCollection files)
            {            string[] FileNames = new string[files.Count];
                if (files == null) return (string[])null;
                for (int i = 0; i < files.Count; i++)
                {   ///获取当前上载的文件
                    HttpPostedFile postedFile = files[i];
                    if (postedFile == null) continue;
                    ///获取文件的名称和扩展名
                    string fileName = Path.GetFileNameWithoutExtension(postedFile.FileName);
                    string extension = Path.GetExtension(postedFile.FileName);
                    FileNames[i] = fileName + extension;
                }
                return FileNames;
            }
      

  5.   

    本来在HttpFileCollection 就会包括上传文件的地址和文件名信息的。
      

  6.   

    Request.Files就可以.
    里边包括文件内容和文件路径信息等.
      

  7.   

    仅当 HTTP 请求 Content-Type 值为“multipart/form-data”时,才会填充该文件集合。
    ====
    填充文件集合的意思是,里边包括文件信息(路径,文件名等)包括文件内容(文件大小)