苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 9261|回复: 5

[其他] HttpHelper可以Post的时候上传图片没?

[复制链接]
发表于 2013-8-30 21:45:41 | 显示全部楼层 |阅读模式
我想把本地的图片以Post的方式上传到网站上去,在百度和谷歌找了好久了,没找到可以用的,
http://blog.csdn.net/xinshoubbs/article/details/6537053
上面这个例子我也试过了,最后还是不成功!
大神们帮帮忙吧!


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-8-30 22:06:46 | 显示全部楼层
当让可以,post参数可以是字节,你把图片转成字节纯过去就行了
 楼主| 发表于 2013-8-30 22:34:30 | 显示全部楼层
站长苏飞 发表于 2013-8-30 22:06
当让可以,post参数可以是字节,你把图片转成字节纯过去就行了

还是不懂,把图片转成字节传给PostdataByte参数,但是还有<input type="file" name="upload_file" />中的name怎么传过去,能帮写详细点吗?
发表于 2013-8-30 22:41:32 | 显示全部楼层
这个方法很多,把图片转成base64字符串,当成一个posy参数,name就对接成其他的参数
这是一种,或者用我刚说的转字节,name用get传过去也行。或者还可以,在接收端重你命名,成功后返回新名字就是了,不一定要原名啊
 楼主| 发表于 2013-8-31 08:30:10 | 显示全部楼层
站长苏飞 发表于 2013-8-30 22:41
这个方法很多,把图片转成base64字符串,当成一个posy参数,name就对接成其他的参数
这是一种,或者用我 ...

帮看看第一段代码还有哪里写错了,提交之后,服务器端接收不到$_FILES数组,第二段代码就可以接收得到$_FILES数组,我就是想把第二段代码改用HttpHelper来Post
[code=csharp]public static void HttpUploadFile(string url, string poststr, string fileformname, string filepath, string fileType, string cookie, string refre)
        {
            String fileToUpload = filepath;
            String uploadUrl = url;
            String fileFormName = fileformname;
            String contenttype = fileType;
            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            string ContentTypeStr = "multipart/form-data; boundary=" + boundary;
            StringBuilder sb = new StringBuilder();
            foreach (string c in poststr.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("--");
            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);
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
            //FileStream fileStream = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read);
            byte[] fileStream = File.ReadAllBytes(fileToUpload);
            long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
            byte[] PostData = new byte[length];
            postHeaderBytes.CopyTo(PostData, 0);
            fileStream.CopyTo(PostData, postHeaderBytes.Length);
            boundaryBytes.CopyTo(PostData, postHeaderBytes.Length + fileStream.Length);
            DotNet.Utilities.HttpHelper Http2 = new DotNet.Utilities.HttpHelper();
            DotNet.Utilities.HttpItem Hitem2 = new DotNet.Utilities.HttpItem()
            {
                Method = "Post",
                ContentType = ContentTypeStr,
                URL = url,
                PostdataByte = PostData,
            };
            SoftConfig.WriteLine(Http2.GetHtml(Hitem2).Html);
        }[/code]

第二段代码:
[code=csharp]
/// <summary>
        /// 上传图片文件
        /// </summary>
        /// <param name="url">提交的地址</param>
        /// <param name="poststr">发送的文本串   比如:user=eking&pass=123456  </param>
        /// <param name="fileformname">文本域的名称  比如:name="file",那么fileformname=file  </param>
        /// <param name="filepath">上传的文件路径  比如: c:\12.jpg </param>
        /// <param name="fileType">上传的文件类型 比如:image/jpeg</param>
        /// <param name="cookie">cookie数据</param>
        /// <param name="refre">头部的跳转地址</param>
        /// <returns></returns>
        public string HttpUploadFile(string url, string poststr, string fileformname, string filepath, string fileType, string 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.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";
            StringBuilder sb = new StringBuilder();
            foreach (string c in poststr.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("--");
            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);
            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;
            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(boundaryBytes, 0, boundaryBytes.Length);
            WebResponse responce = webrequest.GetResponse();
            requestStream.Close();
            using (Stream s = responce.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(s))
                {
                    return sr.ReadToEnd();
                }
            }
        }
[/code]
发表于 2013-8-31 08:52:47 | 显示全部楼层
myde520 发表于 2013-8-31 08:30
帮看看第一段代码还有哪里写错了,提交之后,服务器端接收不到$_FILES数组,第二段代码就可以接收得到$_FI ...

和怀疑楼主都不有看过我的Httphelper例子吧,
http://www.sufeinet.com/thread-3-1-1.html
去源码里找找教程

我的Httphelper头信息是属性,你都能成sb的字符串干什么,

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-12-27 21:25

© 2014-2021

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