苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2990|回复: 1

[其他] PHPWIND论坛上传图片问题

[复制链接]
发表于 2014-4-17 16:21:42 | 显示全部楼层 |阅读模式
本帖最后由 jsjrsxpwr 于 2014-4-17 16:27 编辑

@站长苏飞 首先感谢站长帮我解决了PHPWIND论坛登陆的问题,随即又产生了新的问题,那就是如何上传图片到PHpwind论坛。

还是以mydigit.cn为例抓取PHPWIND论坛上传图片的数据包:

浏览器头信息:Content-Type: multipart/form-data; boundary=----------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7

post数据包:
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="Filename"

123.JPG
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="uid"

461845
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="verify"

4f2785cb
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="step"

2
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="fid"

85
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="desc"

123.JPG
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="Filedata"; filename="123.JPG"
Content-Type: application/octet-stream

文件信息 ------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7
Content-Disposition: form-data; name="Upload"

Submit Query
------------cH2ae0GI3gL6ei4ae0Ij5Ij5ae0KM7--

返回数据为:

<?xml version="1.0" encoding="gbk"?><ajax><![CDATA[{"aid":"3953401","path":"http://img.mydigit.net/Mon_1404/85_461845_0fc75deaf1018ce.jpg"}]]></ajax>

百度一圈后,发现论坛有类似的问题,仿照前面的代码写了一段程序,上传到图片到论坛结果返回数据为
{"uid":"461845","step":2,"verify":"4f2785cb"}
说明:问题应该和cookie没有关系,问题是出在我的文件构造上呢?还是其它?


附上抄过来改写的代码HttpUploadFile("http://bbs.mydigit.cn/job.php?action=mutiupload&random=92&photoid=0&aid=0&t=" + gettime(), "Filename=123.JPG&desc=123.JPG&fid=85&verify=" + verify + "&uid=" + uid + "&step=2" , "Upload=Submit Query", "Filedata", "123.JPG", "application/octet-stream", cookie, "http://bbs.mydigit.cn/post.php?fid=85");



public string HttpUploadFile(string url, string headpoststr, string afterfilepoststr, string fileformname, string filepath, string fileType, CookieCollection cookie, string refre)
        {
            String fileToUpload = filepath;
            String uploadUrl = url;
            String fileFormName = fileformname;
            String contenttype = fileType;
            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
            webrequest.CookieContainer=new CookieContainer();
            webrequest.CookieContainer.Add(cookie);


            webrequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";

            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";

            StringBuilder sb = new StringBuilder();
            foreach (string c in headpoststr.Split('&'))
            {
                string[] item = c.Split('=');
                if (item.Length != 2)
                {
                    break;
                }
                string name = item[0];
                string value = item[1];
                sb.Append(boundary);
                sb.Append("\r\n");
                sb.Append("Content-Disposition: form-data; name=\"" + name + "\"");
                sb.Append("\r\n\r\n");
                sb.Append(value);
                sb.Append("\r\n");
            }

            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();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);//头信息



            sb = new StringBuilder();
            sb.Append("\r\n");
            foreach (string c in afterfilepoststr.Split('&'))
            {
                string[] item = c.Split('=');
                if (item.Length != 2)
                {
                    break;
                }
                string name = item[0];
                string value = item[1];
                sb.Append(boundary);
                sb.Append("\r\n");
                sb.Append("Content-Disposition: form-data; name=\"" + name + "\"");
                sb.Append("\r\n\r\n");
                sb.Append(value);
                sb.Append("\r\n");
            }


            string afterfileHeader = sb.ToString();
            byte[] afterfileHeaderBytes = Encoding.UTF8.GetBytes(afterfileHeader);//文件后面的信息



            byte[] boundaryBytes = Encoding.ASCII.GetBytes(boundary + "--");//结束信息

            FileStream fileStream = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length +afterfileHeaderBytes.Length + boundaryBytes.Length;
            webrequest.ContentLength = length;
            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(afterfileHeaderBytes, 0, afterfileHeaderBytes.Length);//写文件后信息

            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);//结束信息
            WebResponse responce = webrequest.GetResponse();
            requestStream.Close();
            using (Stream s = responce.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(s))
                {
                    return sr.ReadToEnd();
                }
            }
        }







1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-4-17 20:50:53 | 显示全部楼层
参考了这里,
http://hi.baidu.com/wgscd/item/846ada996415fe89591461c4
我数据构造有点问题,解决。

数据构造参考如下文字:
详细解释如下:
Content-Type: multipart/form-data; boundary=AaB03x
如上面所示,首先声明数据类型为multipart/form-data, 然后定义边界字符串AaB03x,这个边界字符串就是用来在下面来区分各个数据的,可以随便定义,但是最好是用破折号等数据中一般不会出现的字符。然后是换行符。
注意:Post中定义的换行符是\r\n
--AaB03x
这个是边界字符串,注意每一个边界符前面都需要加2个连字符“--”,然后跟上换行符。
Content-Disposition: form-data; name="submit-name"
这里是Key-Value数据中字符串类型的数据。 submit-name 是这个Key-Value数据中的Key。当然也需要换行符。
Larry
这个就是刚才Key-Value数据中的value。
--AaB03x
边界符,表示数据结束。
Content-Disposition: form-data; name="file"; filename="file1.dat"
这个代表另外一个数据,它的key是file,文件名是file1.dat。 注意:最后面没有分号了。
Content-Type: application/octet-stream
这个标识文件类型。application/octet-stream表示二进制数据。
... contents of file1.dat ...
这个是文件内容。可以使二进制的数据。
--AaB03x--
数据结束后的分界符,注意因为这个后面没有数据了所以需要在后面追加一个“--”表示结束。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-1-8 04:18

© 2014-2021

快速回复 返回顶部 返回列表