• C#模拟POST上传文件帮助类(支持https、http)


     public static int PostFile(string getUrl, CookieContainer cookieContainer, HttpHeader header, string postdata, byte[] postdatabyte, Stream sm)
            {
                Stream fileStream;
                if (sm != null)
                {
                    fileStream = sm;
                }
                else
                {
                    fileStream = new MemoryStream(postdatabyte);
                }
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls;//https形式需要添加
                int returnValue = 0;
                fileStream.Position = 0;
                var r = new BinaryReader(fileStream);
                string strBoundary = "--"+ DateTime.Now.Ticks.ToString("x");
                byte[] boundaryBytes = Encoding.ASCII.GetBytes(" --" + strBoundary + "-- ");
                //请求头部信息
                StringBuilder sb = new StringBuilder();
                sb.Append("--");
                sb.Append(strBoundary);
                sb.Append(" ");
                sb.Append("Content-Disposition: form-data; name="importType"");
                sb.Append(" 1");
                sb.Append(" ");
                sb.Append("--");
                sb.Append(strBoundary);
                sb.Append(" ");
                sb.Append("Content-Disposition: form-data; name="file"; filename="1.xls"");
                sb.Append(" ");
                sb.Append("Content-Type: ");
                sb.Append("application/octet-stream");
                sb.Append(" ");
                string strPostHeader = sb.ToString();
                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
                try
                {
                    // 根据uri创建HttpWebRequest对象
                    HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(getUrl));
                    httpReq.Method = "POST";
                    //对发送的数据不使用缓存
                    httpReq.AllowWriteStreamBuffering = false;
                    //设置获得响应的超时时间(300秒)
                    httpReq.Timeout = 300000;
                    //httpReq.ServicePoint.Expect100Continue = false;
                    httpReq.CookieContainer = cookieContainer;
                    httpReq.Accept = header.accept;
                    //httpReq.Headers.Add("Accept-Encoding","gzip, deflate, br");
                    //httpReq.Headers.Add("TE", "Trailers");
                    httpReq.UserAgent = header.userAgent;
                    httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
                    long length = fileStream.Length + postHeaderBytes.Length + boundaryBytes.Length;
                    long fileLength = fileStream.Length;
                    httpReq.ContentLength = length;
                    byte[] buffer = new byte[fileLength];
                    Stream postStream = httpReq.GetRequestStream();
                    //发送请求头部消息
                    postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                    int size = r.Read(buffer, 0, buffer.Length);
                    postStream.Write(buffer, 0, size);
                    //添加尾部的时间戳
                    postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                    postStream.Close();
                    //获取服务器端的响应
                    HttpWebResponse webRespon = (HttpWebResponse)httpReq.GetResponse();
                    if (webRespon.StatusCode == HttpStatusCode.OK) //如果服务器未响应,那么继续等待相应                 
                    {
                        Stream s = webRespon.GetResponseStream();
                        StreamReader sr = new StreamReader(s);
                        //读取服务器端返回的消息
                        String sReturnString = sr.ReadLine();
                        s.Close();
                        sr.Close();
                        fileStream.Close();
                     returnValue=returnValue;
                    }
                }
                catch (Exception ex)
                {
                    UnionLog.WriteLog(LogType.UNION_ERROR, string.Format("导入Excel失败:{0}", ex.Message));
                }
                return returnValue;
            }

    特别注意:代码中包括“--”的地方不可以随意更改,否则踩坑。

  • 相关阅读:
    网课必备,自动入会
    大数据分析 RDD 实训作业
    Mysql基础
    Redis 中 scan 命令太坑了,千万别乱用!!
    SD/XOI 2022 多边形
    SQL查询 相同部门 中 年龄最大的 员工信息(A元素相同,查询B元素最大的数据)
    【教程】fastjson升级,spring boot设置fastjson2做序列化反序列化
    02Web服务器 和 应用服务器
    www
    01从软、硬 两个层面理解何为服务器?
  • 原文地址:https://www.cnblogs.com/JustinLau/p/12362794.html
Copyright © 2020-2023  润新知