Browse Source

上传图片接口

lcl 1 year ago
parent
commit
2f959d8c5c
1 changed files with 117 additions and 0 deletions
  1. 117 0
      Util/HaoDa/HaoDaHelper.cs

+ 117 - 0
Util/HaoDa/HaoDaHelper.cs

@@ -1,8 +1,11 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
+using System.Net;
 using System.Security.Cryptography;
 using System.Text;
+using Aop.Api.Util;
 using Library;
 
 namespace MySystem
@@ -59,6 +62,120 @@ namespace MySystem
             return result;
         }
 
+        #region 上传图片接口
+        /// <summary>
+        /// 执行带文件上传的HTTP POST请求。
+        /// </summary>
+        /// <param name="url">请求地址</param>
+        /// <param name="textParams">请求文本参数</param>
+        /// <param name="fileParams">请求文件参数</param>
+        /// <param name="charset">编码字符集</param>
+        /// <returns>HTTP响应</returns>
+        public string DoPost(string url, string token, IDictionary<string, string> textParams, IDictionary<string, FileItem> fileParams, string charset = "utf-8")
+        {
+            // 如果没有文件参数,则走普通POST请求
+            if (fileParams == null || fileParams.Count == 0)
+            {
+                return "";
+            }
+
+            string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
+
+            HttpWebRequest req = GetWebRequest(url, "POST");            
+            req.Headers.Add("X-File-Token", token);
+            req.ContentType = "multipart/form-data;charset=" + charset + ";boundary=" + boundary;
+
+            Stream reqStream = req.GetRequestStream();
+            byte[] itemBoundaryBytes = Encoding.GetEncoding(charset).GetBytes("\r\n--" + boundary + "\r\n");
+            byte[] endBoundaryBytes = Encoding.GetEncoding(charset).GetBytes("\r\n--" + boundary + "--\r\n");
+
+            // 组装文本请求参数
+            string textTemplate = "Content-Disposition:form-data;name=\"{0}\"\r\nContent-Type:text/plain\r\n\r\n{1}";
+            IEnumerator<KeyValuePair<string, string>> textEnum = textParams.GetEnumerator();
+            while (textEnum.MoveNext())
+            {
+                string textEntry = string.Format(textTemplate, textEnum.Current.Key, textEnum.Current.Value);
+                byte[] itemBytes = Encoding.GetEncoding(charset).GetBytes(textEntry);
+                reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
+                reqStream.Write(itemBytes, 0, itemBytes.Length);
+            }
+
+            // 组装文件请求参数
+            string fileTemplate = "Content-Disposition:form-data;name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
+            IEnumerator<KeyValuePair<string, FileItem>> fileEnum = fileParams.GetEnumerator();
+            while (fileEnum.MoveNext())
+            {
+                string key = fileEnum.Current.Key;
+                FileItem fileItem = fileEnum.Current.Value;
+                string fileEntry = string.Format(fileTemplate, key, fileItem.GetFileName(), fileItem.GetMimeType());
+                byte[] itemBytes = Encoding.GetEncoding(charset).GetBytes(fileEntry);
+                reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
+                reqStream.Write(itemBytes, 0, itemBytes.Length);
+
+                byte[] fileBytes = fileItem.GetContent();
+                reqStream.Write(fileBytes, 0, fileBytes.Length);
+            }
+
+            reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
+            reqStream.Close();
+
+            HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
+            Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
+            return GetResponseAsString(rsp, encoding);
+        }
+
+        public HttpWebRequest GetWebRequest(string url, string method)
+        {
+            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
+            req.ServicePoint.Expect100Continue = false;
+            req.Method = method;
+            req.KeepAlive = true;
+            req.Timeout = 100000;
+            return req;
+        }
+
+        /// <summary>
+        /// 把响应流转换为文本。
+        /// </summary>
+        /// <param name="rsp">响应流对象</param>
+        /// <param name="encoding">编码方式</param>
+        /// <returns>响应文本</returns>
+        public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
+        {
+            StringBuilder result = new StringBuilder();
+            Stream stream = null;
+            StreamReader reader = null;
+
+            try
+            {
+                // 以字符流的方式读取HTTP响应
+                stream = rsp.GetResponseStream();
+                reader = new StreamReader(stream, encoding);
+
+                // 按字符读取并写入字符串缓冲
+                int ch = -1;
+                while ((ch = reader.Read()) > -1)
+                {
+                    // 过滤结束符
+                    char c = (char)ch;
+                    if (c != '\0')
+                    {
+                        result.Append(c);
+                    }
+                }
+            }
+            finally
+            {
+                // 释放资源
+                if (reader != null) reader.Close();
+                if (stream != null) stream.Close();
+                if (rsp != null) rsp.Close();
+            }
+
+            return result.ToString();
+        }
+        #endregion
+
         public Dictionary<string, string> GetHeader(Dictionary<string, object> reqdic)
         {
             Dictionary<string, string> headdic = new Dictionary<string, string>();