场景描述:
特别声明
以下代码也是我从网络上复制的别人的,但是一开始跑我这边有点报错就稍微调整了一下。同时也是记录一下
服务端接口接受一个客户端上传的文件流后进行后续的业务操作。

客户端:
Modle类:

public class UploadParameterType{public UploadParameterType(){FileNameKey = "file";Encoding = Encoding.UTF8;PostParameters = new Dictionary<string, string>();}/// <summary>/// 上传地址/// </summary>public string Url { get; set; }/// <summary>/// 文件名称key/// </summary>public string FileNameKey { get; set; }/// <summary>/// 文件名称value/// </summary>public string FileNameValue { get; set; }/// <summary>/// 编码格式/// </summary>public Encoding Encoding { get; set; }/// <summary>/// 上传文件的流/// </summary>public Stream UploadStream { get; set; }/// <summary>/// 上传文件 携带的参数集合/// </summary>public IDictionary<string, string> PostParameters { get; set; }}

HTTP请求方法

 public static string Execute(UploadParameterType parameter){// 1.分界线string boundary = string.Format("----{0}", DateTime.Now.Ticks.ToString("x")),       // 分界线可以自定义参数beginBoundary = string.Format("--{0}\r\n", boundary),endBoundary = string.Format("\r\n--{0}--\r\n", boundary);byte[] beginBoundaryBytes = parameter.Encoding.GetBytes(beginBoundary),endBoundaryBytes = parameter.Encoding.GetBytes(endBoundary);byte[] postBytes = new byte[] { };using (MemoryStream memoryStream = new MemoryStream()){// 2.组装开始分界线数据体 到内存流中memoryStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);// 3.组装 上传文件附加携带的参数 到内存流中if (parameter.PostParameters != null && parameter.PostParameters.Count > 0){foreach (KeyValuePair<string, string> keyValuePair in parameter.PostParameters){string parameterHeaderTemplate = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n{2}", keyValuePair.Key, keyValuePair.Value, beginBoundary);byte[] parameterHeaderBytes = parameter.Encoding.GetBytes(parameterHeaderTemplate);memoryStream.Write(parameterHeaderBytes, 0, parameterHeaderBytes.Length);}}// 4.组装文件头数据体 到内存流中string fileHeaderTemplate = string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n", parameter.FileNameKey, parameter.FileNameValue);byte[] fileHeaderBytes = parameter.Encoding.GetBytes(fileHeaderTemplate);memoryStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length);// 5.组装结束分界线数据体 到内存流中//memoryStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);// 6.获取二进制数据postBytes = memoryStream.ToArray();}// 7.HttpWebRequest 组装HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(parameter.Url, UriKind.RelativeOrAbsolute));//对发送的数据不使用缓存【重要、关键】webRequest.AllowWriteStreamBuffering = false;webRequest.Method = "POST";webRequest.Timeout = 1800000;webRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);webRequest.ContentLength = postBytes.Length + parameter.UploadStream.Length + endBoundaryBytes.Length;webRequest.Headers.Add("X-Access-Token", "HSY715896176423170048");if (Regex.IsMatch(parameter.Url, "^https://")){ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;}// 8.组装文件流byte[] buffer = new byte[1024 * 1024 * 1];int size = parameter.UploadStream.Read(buffer, 0, buffer.Length);Stream requestStream = webRequest.GetRequestStream();requestStream.Write(postBytes, 0, postBytes.Length);while (size > 0){requestStream.Write(buffer, 0, size);size = parameter.UploadStream.Read(buffer, 0, buffer.Length);}requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);requestStream.Close();// 9.获取响应using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()){using (StreamReader reader = new StreamReader(webResponse.GetResponseStream(), parameter.Encoding)){string body = reader.ReadToEnd();reader.Close();return body;}}}

上面的代码片段里面有针对请求https接口进行了证书处理顾增加一下代码:

 static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors){return true;}

客户端调用上传:

  public static void UploadFiles(){try{using (FileStream fs = new FileStream(@"C:\Users\wh\Desktop\各类型发票\电子发票.jpg", FileMode.Open, FileAccess.Read)){Dictionary<string, string> postParameter = new Dictionary<string, string>();postParameter.Add("name", "heshang");postParameter.Add("param", "1 2 3");string result = Execute(new UploadParameterType{Url = "上传文件的服务端地址",UploadStream = fs,FileNameValue = "电子发票.jpg",PostParameters = postParameter});}}catch (Exception){throw;}}

最后上图postman:

最后还有个老哥的链接参考:
c#上传文件参考链接

最后加油!西红柿。

c#客户端上传文件到服务器相关推荐

  1. Silverlight从客户端上传文件到服务器

    这里介绍的是一种利用WebClient手动发送Stream到服务器页面的上传文件方法. 一.服务器接收文件 这里使用一个ASHX页面来接收和保存Silverlight传来的Stream,页面代码如下: ...

  2. WebClient上传文件至服务器和下载服务器文件至客户端

    #region WebClient上传文件至服务器 /// <summary> /// WebClient上传文件至服务器 /// </summary> /// <par ...

  3. Java服务器与客户端传文件,java实现上传文件到服务器和客户端.pdf

    java实实现现上上传传文文件件到到服服务务器器和和客客户户端端 这篇文章主要为大家详细介绍了java实现上传文件到服务器和客户端,具有一定的参考价值,感兴趣的小伙伴们 以参考一下 JAVA编写一个 ...

  4. java 客户端上传_java实现上传文件到服务器和客户端

    JAVA编写一个可以上传文件的服务器和客户端,具体内容如下 服务端 class Server { public static void main(String[] args) throws Excep ...

  5. C 上传文件到服务器(含接收端源码)

    2019独角兽企业重金招聘Python工程师标准>>> 本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail ...

  6. android 上传文件到服务器

    1.编写layout.xml <LinearLayout android:layout_width="match_parent"android:layout_height=& ...

  7. jsch 移动服务器上文件,jsch上传文件到服务器

    需求就是上传文件到服务器,服务器的存储地址由程序决定然后可以自动创建. 使用第三方:jsch JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文 ...

  8. JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端

    java模拟TCP通信实现客户端上传文件到服务器端,供大家参考,具体内容如下 客户端 package com.zr; import java.io.FileInputStream; import ja ...

  9. java ftp 上传文件到服务器,java实现ftp上传文件到服务器

    java实现ftp上传文件到服务器 内容精选 换一换 怎样上传文件到Windows操作系统云服务器?安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ ...

最新文章

  1. mybatis使用注解开发
  2. Navicat连接mysql数据库
  3. SQL Server表的数据量大小查询
  4. Dubbo环境搭建-ZooKeeper注册中心
  5. java阻塞超时_JAVA防线程阻塞(超时控制)
  6. 通过google app engine 在google cloud 部署支持quic的Java web 应用(多种方式)
  7. 想转行做web前端工程师,必学这6大技能!你都知道吗?
  8. http1.0和http1.1和http2.0有什么区别
  9. 我的世界服务器显示英文,我的世界pixelmon服务器技能显示英文
  10. 长沙理工大学计算机网络试题,长沙理工大学考试试卷(计算机网络)要点.docx
  11. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理
  12. [2018.03.13 T1] 比赛(contest)
  13. 压力换算公斤单位换算_压力与重量换算(公斤换算压力)
  14. Android自定义消息推送
  15. 全国哀悼日,黑白网页CSS滤镜代码
  16. 从零开始iOS8编程【HelloWorld】
  17. 数理逻辑—24个(16组)重要等值式
  18. ​云队友丨两次疫情冲击,却两次成功上市,携程是怎么做到的?
  19. php后缀加swp,当编辑文件出现swp的时候如何处理
  20. LZW压缩算法(数据无损压缩)

热门文章

  1. 深入浅出谈谈IP协议
  2. Windows系统安装otf(OpenType)字体提示字体文件损坏解决办法
  3. ArcGIS超级工具SPTOOLS-线封闭,点集转面
  4. Tomcat安装及IDEA配置Tomcat教程
  5. 1-【先导片】给年轻人的跨学科通识课-360P 流畅-AVC
  6. Tomcat载入两次问题
  7. 最优雅的转链 - 淘客万能转链接口
  8. Matlab简单实现Kmeans聚类分析
  9. 使命召唤手游需要的配置及要求
  10. linux安装spark安装(详解版-单机/伪分布)