zoukankan      html  css  js  c++  java
  • WebClient 实现多文件/文本同时上传

    public class CreateBytes
        {
            Encoding encoding = Encoding.UTF8;
    
            /**/
            /// <summary>
            /// 拼接所有的二进制数组为一个数组
            /// </summary>
            /// <param name="byteArrays">数组</param>
            /// <returns></returns>
            /// <remarks>加上结束边界</remarks>
            public byte[] JoinBytes(ArrayList byteArrays)
            {
                int length = 0;
                int readLength = 0;
    
                // 加上结束边界
                string endBoundary = Boundary + "--
    "; //结束边界
                byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);
                byteArrays.Add(endBoundaryBytes);
    
                foreach (byte[] b in byteArrays)
                {
                    length += b.Length;
                }
                byte[] bytes = new byte[length];
    
                // 遍历复制
                //
                foreach (byte[] b in byteArrays)
                {
                    b.CopyTo(bytes, readLength);
                    readLength += b.Length;
                }
    
                return bytes;
            }
    
            public bool UploadData(string uploadUrl, byte[] bytes, out byte[] responseBytes)
            {
                WebClient webClient = new WebClient();
                webClient.Headers.Add("Content-Type", ContentType);
    
                try
                {
                    responseBytes = webClient.UploadData(uploadUrl, bytes);
                    return true;
                }
                catch (WebException ex)
                {
                    Stream resp = ex.Response.GetResponseStream();
                    responseBytes = new byte[ex.Response.ContentLength];
                    resp.Read(responseBytes, 0, responseBytes.Length);
                }
                return false;
            }
    
    
    
            /**/
            /// <summary>
            /// 获取普通表单区域二进制数组
            /// </summary>
            /// <param name="fieldName">表单名</param>
            /// <param name="fieldValue">表单值</param>
            /// <returns></returns>
            /// <remarks>
            /// -----------------------------7d52ee27210a3c
    Content-Disposition: form-data; name="表单名"
    
    表单值
    
            /// </remarks>
            public byte[] CreateFieldData(string fieldName, string fieldValue)
            {
                string textTemplate = Boundary + "
    Content-Disposition: form-data; name="{0}"
    
    {1}
    ";
                string text = String.Format(textTemplate, fieldName, fieldValue);
                byte[] bytes = encoding.GetBytes(text);
                return bytes;
            }
    
    
            /**/
            /// <summary>
            /// 获取文件上传表单区域二进制数组
            /// </summary>
            /// <param name="fieldName">表单名</param>
            /// <param name="filename">文件名</param>
            /// <param name="contentType">文件类型</param>
            /// <param name="contentLength">文件长度</param>
            /// <param name="stream">文件流</param>
            /// <returns>二进制数组</returns>
            public byte[] CreateFieldData(string fieldName, string filename, string contentType, byte[] fileBytes)
            {
                string end = "
    ";
                string textTemplate = Boundary + "
    Content-Disposition: form-data; name="{0}"; filename="{1}"
    Content-Type: {2}
    
    ";
    
                // 头数据
                string data = String.Format(textTemplate, fieldName, filename, contentType);
                byte[] bytes = encoding.GetBytes(data);
    
    
    
                // 尾数据
                byte[] endBytes = encoding.GetBytes(end);
    
                // 合成后的数组
                byte[] fieldData = new byte[bytes.Length + fileBytes.Length + endBytes.Length];
    
                bytes.CopyTo(fieldData, 0); // 头数据
                fileBytes.CopyTo(fieldData, bytes.Length); // 文件的二进制数据
                endBytes.CopyTo(fieldData, bytes.Length + fileBytes.Length); // 
    
    
                return fieldData;
            }
    
    
            #region 属性
            public string Boundary
            {
                get
                {
                    string[] bArray, ctArray;
                    string contentType = ContentType;
                    ctArray = contentType.Split(';');
                    if (ctArray[0].Trim().ToLower() == "multipart/form-data")
                    {
                        bArray = ctArray[1].Split('=');
                        return "--" + bArray[1];
                    }
                    return null;
                }
            }
    
            public string ContentType
            {
                get
                {
                    if (HttpContext.Current == null)
                    {
                        return "multipart/form-data; boundary=---------------------------7d5b915500cee";
                    }
                    return HttpContext.Current.Request.ContentType;
                }
            }
            #endregion
        }

    调用方式如下:

    CreateBytes cb = new CreateBytes();
                // 所有表单数据
                ArrayList bytesArray = new ArrayList();
                // 普通表单
                bytesArray.Add(cb.CreateFieldData("jsonDataStr", ""));
    
    
    
                // 读文件流
                FileStream fs = new FileStream("wolfy.JPG", FileMode.Open,
                    FileAccess.Read, FileShare.Read);
    
                string ContentType = "application/octet-stream";
                byte[] fileBytes = new byte[fs.Length];
                fs.Read(fileBytes, 0, Convert.ToInt32(fs.Length));
    
                // 文件表单
                bytesArray.Add(cb.CreateFieldData("file1", "wolfy.JPG", ContentType, fileBytes));
    
                bytesArray.Add(cb.CreateFieldData("file2", "wolfy1.JPG", ContentType, fileBytes));
                // 合成所有表单并生成二进制数组
                byte[] bytes = cb.JoinBytes(bytesArray);
    
                // 返回的内容
                byte[] responseBytes;
    
                bool uploaded = cb.UploadData("http://localhost:8700/api/System/ImgUpload", bytes, out responseBytes);
  • 相关阅读:
    ASP Loading
    haproxy中两个常用的宏
    数字签名-摘要等
    haproxy内存管理-free_list原理
    haproxy-代码阅读-内存管理
    网卡中断不均衡处理
    TIME_WAIT 另一种解决方式 SO_LINGER
    HTTP报文格式
    TIME_WAIT过多及解决
    awk如何向shell传值
  • 原文地址:https://www.cnblogs.com/q975261413/p/5882868.html
Copyright © 2011-2022 走看看