httpwatch获得出来的参数-----------------------------7db4e2920b3e
Content-Disposition: form-data; name="__VIEWSTATE"/wEPDwULLTEwMDQ2MjQ4MjcPZBYCAgMPFgIeB2VuY3R5cGUFE211bHRpcGFydC9mb3JtLWRhdGFkZA==
-----------------------------7db4e2920b3e
Content-Disposition: form-data; name="__EVENTVALIDATION"/wEWBQKp6aXABQL4kuGeCALt3oXMAwLm3PTRCALY4+lr
-----------------------------7db4e2920b3e
Content-Disposition: form-data; name="fuLoad"; filename="D:\eclipse3.1\eclipse3.1\workspace2\bjrjbrWeb\WebRoot\admin\upload\userUploadImage\1245723790453esf1.jpg"
Content-Type: image/pjpeg?
Content-Disposition: form-data; name="upfile"鐐瑰嚮涓婁紶鍥剧墖鎸夐挳锛屼笂浼犲浘鐗?
-----------------------------7db4e2920b3e
Content-Disposition: form-data; name="btnUpload"涓婁紶
-----------------------------7db4e2920b3e
Content-Disposition: form-data; name="hidShiNei"
-----------------------------7db4e2920b3e--只上传图片已经上传成功了,现在这个里面又添加了参数VIEWSTATE,EVENTVALIDATION,upfile等
发送图片也是在网上找的
String contenttype = "image/jpeg";
            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            try
            {
                HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
                webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
                webrequest.Method = "POST";
                StringBuilder sb = new StringBuilder();
                sb.Append("--"); 
                sb.Append(boundary);
                sb.Append("\r\n");
                sb.Append("Content-Disposition: form-data; name=\"");
                sb.Append(fileFormName);
                sb.Append("\"; filename=\"");
                sb.Append(Path.GetFileName(fileToUpload));
                sb.Append("\"");
                sb.Append("\r\n");
                sb.Append("Content-Type: ");
                sb.Append(contenttype);
                sb.Append("\r\n");
                sb.Append("\r\n");                //string postHeader = sb.ToString() + postDateAdd;
                //string postData = "";
                //if (postDateAdd != "")
                //{
                 //   StringBuilder post = new StringBuilder();
                 //   string[] array = postDateAdd.Split('&');
                 //   foreach (string str in array)
                 //   {
                 //       string[] arr = str.Split('=');
                 //       post.AppendFormat("{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", boundary, arr[0], arr[1]);
                //    }
               //     post.AppendFormat("{0}--\r\n", boundary);
                //    postData = post.ToString();
               // }                string postHeader = sb.ToString();
                                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);                //byte[] postDateAddBytes = encoding.GetBytes(postData);                byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");                FileStream fileStream = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read);
                long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length + postDateAddBytes.Length;
                webrequest.ContentLength = length;
                webrequest.CookieContainer = cc;
                webrequest.AllowAutoRedirect = true;                webrequest.ServicePoint.ConnectionLimit = maxTry;
                webrequest.Referer = uploadUrl;
                webrequest.Accept = accept;
                webrequest.UserAgent = userAgent;                Stream requestStream = webrequest.GetRequestStream();                //requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);                requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);                byte[] buffer = new Byte[(int)fileStream.Length];
                int bytesRead = 0;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    requestStream.Write(buffer, 0, bytesRead);                
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);                HttpWebResponse res = (HttpWebResponse)webrequest.GetResponse();                StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
                string html = sr.ReadToEnd();
                                requestStream.Close();
                return html;想知道VIEWSTATE,EVENTVALIDATION,upfile这些参数是怎么传上去的?

解决方案 »

  1.   

    现在我是这样写的String contenttype = "image/jpeg";
                string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
                try
                {
                    HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
                    webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
                    webrequest.Method = "POST";
                    StringBuilder sb = new StringBuilder();
                    sb.Append("--"); 
                    sb.Append(boundary);
                    sb.Append("\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"");
                    sb.Append(fileFormName);
                    sb.Append("\"; filename=\"");
                    sb.Append(Path.GetFileName(fileToUpload));
                    sb.Append("\"");
                    sb.Append("\r\n");
                    sb.Append("Content-Type: ");
                    sb.Append(contenttype);
                    sb.Append("\r\n");
                    sb.Append("\r\n");                //string postHeader = sb.ToString() + postDateAdd;
                    string postData = "";
                    if (postDateAdd != "")
                    {
                        StringBuilder post = new StringBuilder();
                        string[] array = postDateAdd.Split('&');
                        foreach (string str in array)
                        {
                            string[] arr = str.Split('=');
                            post.AppendFormat("{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", boundary, arr[0], arr[1]);
                        }
                        post.AppendFormat("{0}--\r\n", boundary);
                        postData = post.ToString();
                    }                string postHeader = sb.ToString();                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);                byte[] postDateAddBytes = Encoding.ASCII.GetBytes(postData);                //byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                    FileStream fileStream = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read);
                    //long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length + postDateAddBytes.Length;
                    long length = postHeaderBytes.Length + fileStream.Length + postDateAddBytes.Length;
                    webrequest.ContentLength = length;
                    webrequest.CookieContainer = cc;
                    webrequest.AllowAutoRedirect = true;                webrequest.ServicePoint.ConnectionLimit = maxTry;
                    webrequest.Referer = uploadUrl;
                    webrequest.Accept = accept;
                    webrequest.UserAgent = userAgent;                Stream requestStream = webrequest.GetRequestStream();                                requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);                byte[] buffer = new Byte[(int)fileStream.Length];
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                        requestStream.Write(buffer, 0, bytesRead);                //requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);                requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);                HttpWebResponse res = (HttpWebResponse)webrequest.GetResponse();                StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
                    string html = sr.ReadToEnd();
                                    requestStream.Close();
                    return html;
      

  2.   

    这个发送图片
    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);                byte[] buffer = new Byte[(int)fileStream.Length];
                    
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                        requestStream.Write(buffer, 0, bytesRead);requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);发送剩下的字段可以这样写吗?我调试获得出来的,跟截取的一样的,可是就是上传不上去
      

  3.   

    这是我的发图的部分代码,不完整,仅供参考:            string[] props = new string[] { "subject", "message", "formhash"};//, "fid" ,"posteditor_mediatyperadio","wysiwyg","previewbutton"};
                string[] values = new string[] { bt, ct, p.formhash};//, p.typeid, "on", "1", "预览帖子" };
                //发送每个字段
                sb.Length = 0;
                for (int j = 0; j < props.Length; j++)
                {
                    sb.Append("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + props[j] + "\"\r\n\r\n" + values[j] + "\r\n");
                }
                sb.Append("--" + boundary + "--\r\n");
                byteArray = Encoding.Default.GetBytes(sb.ToString());
                dl.Add(byteArray);
                byteArray = null;
                sb = null;            MemoryStream mss = new MemoryStream();
                for (int j = 0; j < dl.Count; ++j)
                {
                    mss.Write(dl[j], 0, dl[j].Length);
                }
                dl.Clear();
                byteArray = mss.ToArray();
                mss.Close();
      

  4.   


            private bool AddPicture(byte[] fileDate)
            {
                if (fileDate == null) return false;
                if (xh < 20)
                {
                    ++xh;                StringBuilder sb = new StringBuilder();
                    sb.Append("--" + boundary + "\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"attach[]\"; filename=\"" + xh + ".jpg\"\r\n");
                    sb.Append("Content-Type: image/*\r\n\r\n");
                    byte[] byteArray = Encoding.Default.GetBytes(sb.ToString());
                    dl.Add(byteArray);
                    dl.Add(fileDate);
                    sb.Length = 0;
                    sb.Append("\r\n");
                    sb.Append("--" + boundary + "\r\nContent-Disposition: form-data; name=\"localid[]\"\r\n\r\n" + xh + "\r\n");
                    sb.Append("--" + boundary + "\r\nContent-Disposition: form-data; name=\"attachperm[]\"\r\n\r\n0\r\n");
                    sb.Append("--" + boundary + "\r\nContent-Disposition: form-data; name=\"attachprice[]\"\r\n\r\n0\r\n");
                    sb.Append("--" + boundary + "\r\nContent-Disposition: form-data; name=\"attachdesc[]\"\r\n\r\n\r\n");
                    byteArray = Encoding.Default.GetBytes(sb.ToString());
                    dl.Add(byteArray);
                    return true;
                }
                else
                {
                    if (textPics == null) textPics = new Queue<byte[]>();
                    textPics.Enqueue(fileDate);
                    return true;
                }
            }        private bool AddPicture(List<byte[]> DateList)
            {
                if (DateList == null) return false;
                foreach (byte[] fileDate in DateList)
                {
                    AddPicture(fileDate);
                }
                return true;
            }
      

  5.   


    Stream requestStream = webrequest.GetRequestStream();
    requestStream.Write(buffer, 0, bytesRead);
    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
    requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);我想知道可以把那些参数跟图片在一块儿,一个stream里面全都写进去吗?
      

  6.   

    若上传图片,表单的编码类型必须是 multipart/form-data,需要将所有表单字段的数据(包括图片)构造成一个二进制文件,将其Post上去。下面是个例子,为不显示乱码,上传的是文本文件。你需要自己构造这样的文件。
    上传文件的操作界面
    <html>
    <head>
    <meta http-equiv="Content-Language" content="zh-cn">
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>姓名</title>
    </head>
    <body>
    <form method="POST" enctype="multipart/form-data" action="ff.asp">
      <p>姓名:<input type="text" name="xm" size="20"></p>
      <p>简历:<textarea rows="2" name="jl" cols="20"></textarea></p>
      <p>已婚:<input type="checkbox" name="hy" value="Yes" checked></p>
      <p>性别:<input type="radio" value="nan" checked name="sex">男 
      <input type="radio" name="sex" value="nv">女</p>
      <p>文件1:<input type="file" name="File1" size="30"></p>
      <p>文件2:<input type="file" name="File2" size="30"></p>
      <p><input type="submit" value="提交" name="B1"><input type="reset" value="重置" name="B2"></p>
    </form>
    </body>
    </html>提交表单时的处理程序 ff.asp
    <%
    Function bin2str(binstr) 
      Dim oUpFileStream
      Set oUpFileStream = Server.CreateObject("ADODB.Stream")
      oUpFileStream.Type = 1  '二进制格式
      oUpFileStream.Open 
      oUpFileStream.Write binstr
      oUpFileStream.Position=0  
      oUpFileStream.Type = 2  '文本格式
      oUpFileStream.CharSet = "GB2312"
      bin2str=oUpFileStream.ReadText
      oUpFileStream.close
      Set oUpFileStream = nothing
    End Function dim s,d
    s=request.totalbytes   '总字节数
    d= request.binaryread(s) '读取数据
    response.write replace(bin2str(d),vbcrlf,"<br>")
    %>上传的数据输入
    下面是处理程序的显示结果
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="xm"廉东方
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="jl"男,民族:汗
    信息工程系高级讲师
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="hy"Yes
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="sex"nan
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="File1"; filename="E:\Internet\桌面\book.txt"
    Content-Type: text/plain00001 Visual Basic .NET编程指南 (美)Harold 北京 电子工业出版社 2003.1
    00010 C#编程思想与实践 张青,郭亚萍 北京 冶金工业出版社 2002.10
    00008 中文Photoshop 7.0原创风暴 肖金秀 北京 冶金工业出版社 2003.8
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="File2"; filename="E:\Internet\桌面\图片.jpg"
    Content-Type: text/plain虽然扩展名是.jpg,但仍然是文本文件。
    -----------------------------7d6399db02a2
    Content-Disposition: form-data; name="B1"提交
    -----------------------------7d6399db02a2--Ldf 2006-10-8 17:41:37 1【第1楼】可以看出:
    1、各数据项之间的分隔符是:
      -----------------------------7d6399db02a2
    2、分隔符是变化的,每次都不一样
    3、分隔符单独占一行
    4、数据(兰色部分)是以两个回车换行引出
    5、所有数据以二进制格式上传
      

  7.   

    就像你上面那个xm,jl,hy,
    怎么和图片一起上传上去呢?
      

  8.   

    我这个写法对不对呢?
    Stream requestStream = webrequest.GetRequestStream();
    requestStream.Write(buffer, 0, bytesRead);
    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
    requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);
      

  9.   

    这是我上传的过程
    先写入图片的头
    -----------------------------8cdd92a8598c646
    Content-Disposition: form-data; name="file"; filename="20110422021915234.jpg"
    Content-Type: image/pjpeg
    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
    再写入图片
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                        requestStream.Write(buffer, 0, bytesRead);
    再传入
    传入参数
    if (postDateAdd != "")
                        requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);参数格式
    -----------------------------8cdd92c09f2f014
    Content-Disposition: form-data; name="ct"text/html
    -----------------------------8cdd92c09f2f014
    Content-Disposition: form-data; name="rt"http://my.anjuke.com/v2/ajax/uploadcallback/
    -----------------------------8cdd92c09f2f014
    Content-Disposition: form-data; name="comment"{"copyright":"anjuke","name":"楂樻湅鍧","brokerid":"516637"}
    ---------------------------8cdd92c09f2f014
    最后是一个结束的
    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
    格式-----------------------------8cdd92c09f2f014--
      

  10.   


            // 读取网络资源,返回字节数组
            public static byte[] getBytes(string url, CookieContainer cookie, byte[] postData, string contentType)
            {
                try
                {
                    int c = url.IndexOf("/", 10);
                    byte[] data = null;
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Timeout = timeOut;
                    request.AllowAutoRedirect = true;
                    if (cookie != null) request.CookieContainer = cookie;
                    request.Referer = (c > 0 ? url.Substring(0, c) : url);
                    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
                    request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";                if (postData != null)                                           // 需要 Post 数据
                    {
                        request.Method = "POST";
                        if (contentType == null) contentType = "application/x-www-form-urlencoded";
                        request.ContentType = contentType;
                        request.ContentLength = postData.Length;
                        Stream requestStream = request.GetRequestStream();
                        requestStream.Write(postData, 0, postData.Length);
                        requestStream.Close();
                    }                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    //cookies= response.Cookies;
                    //wc=response.Headers;
                    string ce = response.Headers[HttpResponseHeader.ContentEncoding];
                    int ContentLength = (int)response.ContentLength;
                    Stream s = response.GetResponseStream();
                    c = 1024 * 10;
                    if (ContentLength < 0)                                          // 不能获取数据的长度
                    {
                        data = new byte[c];
                        MemoryStream ms = new MemoryStream();
                        int l = s.Read(data, 0, c);
                        while (l > 0)
                        {
                            ms.Write(data, 0, l);
                            l = s.Read(data, 0, c);
                        }
                        data = ms.ToArray();
                        ms.Close();
                    }
                    else                                                            // 数据长度已知
                    {
                        data = new byte[ContentLength];
                        int pos = 0;
                        while (ContentLength > 0)
                        {
                            int l = s.Read(data, pos, ContentLength);
                            pos += l;
                            ContentLength -= l;
                        }
                    }
                    s.Close();
                    response.Close();                if (ce == "gzip")                                               // 若数据是压缩格式,则要进行解压
                    {
                        unRar(ref data);
                    }
                    return data;                                                    // 返回字节数组
                }
                catch
                {
                    return new byte[0];
                }
            }        private static byte[] unRar(ref  byte[] data)     // 解压数据
            {
                try
                {
                    MemoryStream js = new MemoryStream();                       // 解压后的流   
                    MemoryStream ms = new MemoryStream(data);                   // 用于解压的流   
                    GZipStream g = new GZipStream(ms, CompressionMode.Decompress);
                    byte[] buffer = new byte[10240];                                // 读数据缓冲区      
                    int l = g.Read(buffer, 0, 10240);                               // 一次读 10K      
                    while (l > 0)
                    {
                        js.Write(buffer, 0, l);
                        l = g.Read(buffer, 0, 10240);
                    }
                    g.Close();
                    ms.Close();
                    data = js.ToArray();
                    js.Close();
                    return data;
                }
                catch
                {
                    return data;
                }
            }        private byte[] Rar(ref byte[] data)     // 压缩数据
            {
                MemoryStream ys = new MemoryStream();                       // 压缩后的流   
                GZipStream g = new GZipStream(ys, CompressionMode.Compress);
                g.Write(data, 0, data.Length);
                g.Close();
                data=ys.ToArray();
                ys.Close();
                return data;
            }
      

  11.   

    写了之后要close()
                    if (postData != null)                                           // 需要 Post 数据
                    {
                        request.Method = "POST";
                        if (contentType == null) contentType = "application/x-www-form-urlencoded";
                        request.ContentType = contentType;
                        request.ContentLength = postData.Length;
                        Stream requestStream = request.GetRequestStream();
                        requestStream.Write(postData, 0, postData.Length);
                        requestStream.Close();                }
      

  12.   

    改变红色一行的位置试试:               requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);                HttpWebResponse res = (HttpWebResponse)webrequest.GetResponse();
                    requestStream.Close();
                    StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
                    string html = sr.ReadToEnd();
                                    return html;
      

  13.   

    requestStream.Write(postDateAddBytes, 0, postDateAddBytes.Length);
    requestStream.Close();
      HttpWebResponse res = (HttpWebResponse)webrequest.GetResponse();
      StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
      string html = sr.ReadToEnd();
          return html;