• 使用webclient同时post普通表单字段和文件表单字段数据到指定的URL【转】


    如大家要转载,请保留本人的版权:
        /* 
        *Description:在asp.NET代码中同时post普通表单字段和文件表单字段数据到指定的服务器URL。
        *Auther:chongchong2008-天真的好蓝啊
        *MSN:chongchong2008@msn.com
        *QQ:154674958
        *Blog:chongchong2008.cnblogs.com
        *Dates:2012-02-28
        *Copyright:ChongChong2008 YiChang HuBei China 
        */

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using System.Text;
    using System.Net;

    namespace HttpRequest
    {
        /// <summary>
        /// description:http post请求客户端
        /// author:chongchong2008
        /// last-modified-date:2012-02-28
        /// </summary>
        public class HttpRequestClient
        {
            #region //字段
            private ArrayList bytesArray;
            private Encoding encoding = Encoding.UTF8;
            private string boundary = String.Empty;
            #endregion

            #region //构造方法
            public HttpRequestClient()
            {
                bytesArray = new ArrayList();
                string flag = DateTime.Now.Ticks.ToString("x");
                boundary = "---------------------------" + flag;
            }
            #endregion

            #region //方法
            /// <summary>
            /// 合并请求数据
            /// </summary>
            /// <returns></returns>
            private byte[] MergeContent()
            {
                int length = 0;
                int readLength = 0;
                string endBoundary = "--" + boundary + "--\r\n";
                byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);

                bytesArray.Add(endBoundaryBytes);

                foreach (byte[] b in bytesArray)
                {
                    length += b.Length;
                }

                byte[] bytes = new byte[length];

                foreach (byte[] b in bytesArray)
                {
                    b.CopyTo(bytes, readLength);
                    readLength += b.Length;
                }

                return bytes;
            }

            /// <summary>
            /// 上传
            /// </summary>
            /// <param name="requestUrl">请求url</param>
            /// <param name="responseText">响应</param>
            /// <returns></returns>
            public bool Upload(String requestUrl, out String responseText)
            {
                WebClient webClient = new WebClient();
                webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);

                byte[] responseBytes;
                byte[] bytes = MergeContent();

                try
                {
                    responseBytes = webClient.UploadData(requestUrl, bytes);
                    responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
                    return true;
                }
                catch (WebException ex)
                {
                    Stream responseStream = ex.Response.GetResponseStream();
                    responseBytes = new byte[ex.Response.ContentLength];
                    responseStream.Read(responseBytes, 0, responseBytes.Length);
                }
                responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
                return false;
            }

            /// <summary>
            /// 设置表单数据字段
            /// </summary>
            /// <param name="fieldName">字段名</param>
            /// <param name="fieldValue">字段值</param>
            /// <returns></returns>
            public void SetFieldValue(String fieldName, String fieldValue)
            {
                string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
                string httpRowData = String.Format(httpRow, fieldName, fieldValue);

                bytesArray.Add(encoding.GetBytes(httpRowData));
            }

            /// <summary>
            /// 设置表单文件数据
            /// </summary>
            /// <param name="fieldName">字段名</param>
            /// <param name="filename">字段值</param>
            /// <param name="contentType">内容内型</param>
            /// <param name="fileBytes">文件字节流</param>
            /// <returns></returns>
            public void SetFieldValue(String fieldName, String filename, String contentType, Byte[] fileBytes)
            {
                string end = "\r\n";
                string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
                string httpRowData = String.Format(httpRow, fieldName, filename, contentType);

                byte[] headerBytes = encoding.GetBytes(httpRowData);
                byte[] endBytes = encoding.GetBytes(end);
                byte[] fileDataBytes = new byte[headerBytes.Length + fileBytes.Length + endBytes.Length];

                headerBytes.CopyTo(fileDataBytes, 0);
                fileBytes.CopyTo(fileDataBytes, headerBytes.Length);
                endBytes.CopyTo(fileDataBytes, headerBytes.Length + fileBytes.Length);

                bytesArray.Add(fileDataBytes);
            }
            #endregion
        }
    }

    使用方法:

    ----------------------------------------------------------------------------------------------------------------
                string url = "http://127.0.0.1/test/upload";//发送到的页面的地址
                string image_path = "c:/test.jpg";
                FileStream fs = new FileStream(image_path, System.IO.FileMode.Open, System.IO.FileAccess.Read);

                byte[] fileBytes = new byte[fs.Length];
                fs.Read(fileBytes, 0, fileBytes.Length);
                fs.Close();
                fs.Dispose();

                HttpRequestClient httpRequestClient = new HttpRequestClient();
                httpRequestClient.SetFieldValue("id", "123");
                httpRequestClient.SetFieldValue("user_name", "chongchong2008");
                httpRequestClient.SetFieldValue("type_id", "1");

                httpRequestClient.SetFieldValue("uploadfile", "test.jpg", "application/octet-stream", fileBytes);
                string responseText;
                bool uploaded = httpRequestClient.Upload(url, out responseText);


    ===========================================================================
    referrer link: http://www.cnblogs.com/dotey/

    ============================================================================

     
     
     
  • 相关阅读:
    preg_match正则匹配的字符串长度问题
    jquery获得select option的值 和对select option的操作
    一笔一划画蜻蜓
    PHPMyadmin 配置文件详解(配置)
    用smarty产生随机数
    svn提交后测试网站自动发布的配置
    linux打包压缩命令汇总
    HR 业务相关
    ABAP中TYPES与DATA、TYPE与LIKE 区别
    HRinfotype增强笔记(转)
  • 原文地址:https://www.cnblogs.com/rhythmK/p/2853668.html
Copyright © 2020-2023  润新知