转载

首先写客服端,winform模拟一个post提交:

/// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="saveName">文件上传后的名称</param>
/// <param name="progressBar">上传进度条</param>
/// <returns>成功返回1,失败返回0</returns>
private int Upload_Request2(string address, string fileNamePath, string saveName, ProgressBar progressBar)
{
int returnValue = ; // 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs); //时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(saveName);
sb.Append("\";");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // 根据uri创建HttpWebRequest对象
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST"; //对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false; //设置获得响应的超时时间(300秒)
httpReq.Timeout = ;
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
long fileLength = fs.Length;
httpReq.ContentLength = length;
try
{
progressBar.Maximum = int.MaxValue;
progressBar.Minimum = ;
progressBar.Value = ;
//每次上传4k
int bufferLength = ;
byte[] buffer = new byte[bufferLength]; //已上传的字节数
long offset = ; //开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, , bufferLength);
Stream postStream = httpReq.GetRequestStream(); //发送请求头部消息
postStream.Write(postHeaderBytes, , postHeaderBytes.Length);
while (size > )
{
postStream.Write(buffer, , size);
offset += size;
progressBar.Value = (int)(offset * (int.MaxValue / length));
TimeSpan span = DateTime.Now - startTime;
double second = span.TotalSeconds;
lblTime.Text = "已用时:" + second.ToString("F2") + "秒";
if (second > 0.001)
{
lblSpeed.Text = "平均速度:" + (offset / / second).ToString("0.00") + "KB/秒";
}
else
{
lblSpeed.Text = " 正在连接…";
}
lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
Application.DoEvents();
size = r.Read(buffer, , bufferLength);
}
//添加尾部的时间戳
postStream.Write(boundaryBytes, , boundaryBytes.Length);
postStream.Close(); //获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
//读取服务器端返回的消息
StreamReader sr = new StreamReader(s);
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")
{
returnValue = ;
}
else if (sReturnString == "Error")
{
returnValue = ;
}
}
catch
{
returnValue = ;
}
finally
{
fs.Close();
r.Close();
} return returnValue;
}
参数说明如下:
address:接收文件的URL地址,如:http://localhost/UploadFile/Save.aspx
fileNamePath:要上传的本地文件,如:D:\test.rar
saveName:文件上传到服务器后的名称,如:200901011234.rar
progressBar:显示文件上传进度的进度条。
接收文件的WebForm添加一个Save.aspx页面,Load方法如下:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Files.Count > )
{
try
{
HttpPostedFile file = Request.Files[];
//string filePath = "C:\\Documents and Settings\\Administrator\\桌面\\2\\" + file.FileName;//this.MapPath("UploadDocument")
string filePath = "D:\\SourceSafe\\testupform\\" + file.FileName;
file.SaveAs(filePath);
Response.Write("Success");
}
catch
{
Response.Write("Error");
}
}
else
{
Response.Write("Error1");
} }
同时需要配置WebConfig文件的httpRuntime 如下:
<httpRuntime maxRequestLength="102400" executionTimeout="300"/>
不能的话最大只能上传4M了。要是想上传更大的文件,maxRequestLength,executionTimeout设置大些,同时WinForm下的代码行
//设置获得响应的超时时间(300秒)
httpReq.Timeout = 300000;

也要修改,另外别忘了看看IIS的连接超时是否设置为足够大。

 
 
 
  1. /// <summary>
  2. /// 将本地文件上传到指定的服务器(HttpWebRequest方法)
  3. /// </summary>
  4. /// <param name="address">文件上传到的服务器</param>
  5. /// <param name="fileNamePath">要上传的本地文件(全路径)</param>
  6. /// <param name="saveName">文件上传后的名称</param>
  7. /// <param name="progressBar">上传进度条</param>
  8. /// <returns>成功返回1,失败返回0</returns>
  9. private int Upload_Request2(string address, string fileNamePath, string saveName, ProgressBar progressBar)
  10. {
  11. int returnValue = 0;     // 要上传的文件
  12. FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
  13. BinaryReader r = new BinaryReader(fs);     //时间戳
  14. string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
  15. byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");     //请求头部信息
  16. StringBuilder sb = new StringBuilder();
  17. sb.Append("--");
  18. sb.Append(strBoundary);
  19. sb.Append("\r\n");
  20. sb.Append("Content-Disposition: form-data; name=\"");
  21. sb.Append("file");
  22. sb.Append("\"; filename=\"");
  23. sb.Append(saveName);
  24. sb.Append("\";");
  25. sb.Append("\r\n");
  26. sb.Append("Content-Type: ");
  27. sb.Append("application/octet-stream");
  28. sb.Append("\r\n");
  29. sb.Append("\r\n");
  30. string strPostHeader = sb.ToString();
  31. byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);     // 根据uri创建HttpWebRequest对象
  32. HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
  33. httpReq.Method = "POST";     //对发送的数据不使用缓存
  34. httpReq.AllowWriteStreamBuffering = false;     //设置获得响应的超时时间(300秒)
  35. httpReq.Timeout = 300000;
  36. httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
  37. long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
  38. long fileLength = fs.Length;
  39. httpReq.ContentLength = length;
  40. try
  41. {
  42. progressBar.Maximum = int.MaxValue;
  43. progressBar.Minimum = 0;
  44. progressBar.Value = 0;
  45. //每次上传4k
  46. int bufferLength = 4096;
  47. byte[] buffer = new byte[bufferLength]; //已上传的字节数
  48. long offset = 0;         //开始上传时间
  49. DateTime startTime = DateTime.Now;
  50. int size = r.Read(buffer, 0, bufferLength);
  51. Stream postStream = httpReq.GetRequestStream();         //发送请求头部消息
  52. postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  53. while (size > 0)
  54. {
  55. postStream.Write(buffer, 0, size);
  56. offset += size;
  57. progressBar.Value = (int)(offset * (int.MaxValue / length));
  58. TimeSpan span = DateTime.Now - startTime;
  59. double second = span.TotalSeconds;
  60. lblTime.Text = "已用时:" + second.ToString("F2") + "秒";
  61. if (second > 0.001)
  62. {
  63. lblSpeed.Text = "平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒";
  64. }
  65. else
  66. {
  67. lblSpeed.Text = " 正在连接…";
  68. }
  69. lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
  70. lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
  71. Application.DoEvents();
  72. size = r.Read(buffer, 0, bufferLength);
  73. }
  74. //添加尾部的时间戳
  75. postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
  76. postStream.Close();         //获取服务器端的响应
  77. WebResponse webRespon = httpReq.GetResponse();
  78. Stream s = webRespon.GetResponseStream();
  79. //读取服务器端返回的消息
  80. StreamReader sr = new StreamReader(s);
  81. String sReturnString = sr.ReadLine();
  82. s.Close();
  83. sr.Close();
  84. if (sReturnString == "Success")
  85. {
  86. returnValue = 1;
  87. }
  88. else if (sReturnString == "Error")
  89. {
  90. returnValue = 0;
  91. }
  92. }
  93. catch
  94. {
  95. returnValue = 0;
  96. }
  97. finally
  98. {
  99. fs.Close();
  100. r.Close();
  101. } return returnValue;
  102. }
 

C# 向服务器上传文件(客服端winform、服务端web)的更多相关文章

  1. ASP.NET跨服务器上传文件的相关解决方案

    第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ ...

  2. xshell终端向远程服务器上传文件方法

    centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.

  3. 关于nutz跨服务器上传文件

    关于nutz跨服务器上传文件  发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子  标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...

  4. Java模拟客户端向服务器上传文件

    先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...

  5. idea 内置tomcat jersey 跨服务器 上传文件报400错误

    报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status ...

  6. Javaweb向服务器上传文件以及从服务器下载文件的方法

    先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...

  7. 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)

    如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...

  8. 使用Putty实现windows向阿里云的Linux云服务器上传文件

    1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...

  9. asp.net 服务器 上传文件到 FTP服务器

    private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...

  10. 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法

    上传文件: ftp> mput db.iso 550 Permission denied 原因:vsftp默认配置不允许上传文件. 解决:修改/etc/vsftpd.conf 将“write_e ...

随机推荐

  1. [poj1236]Network of Schools(targin缩点SCC)

    题意:有N个学校,从每个学校都能从一个单向网络到另外一个学校.1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次 ...

  2. 转-tcp建立和释放详解

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...

  3. MS SQL JSON类型type

    在MS SQL Server 2016,已经支持JSON处理. 执行下面代码,将获取ms sql server对象类型以及其说明: IF OBJECT_ID('tempdb.dbo.#json_typ ...

  4. React 从入门到进阶之路(五)

    之前的文章我们介绍了  React 事件,方法, React定义方法的几种方式 获取数据 改变数据 执行方法传值.接下来我们将介绍 React 表单事件 键盘事件 事件对象以及 React中 的 re ...

  5. JavaScript中两个数组的拼接

    方法一:使用for循环 var arr = ['tom', 'jerry']; var arr2 = [1, 2]; for(var i=0; i<arr2.length; i++){ arr. ...

  6. AC自动机板子(from. qwer)

    #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> ...

  7. 免打包:简单、灵活、便捷的APP渠道统计方法

    相信做过APP运营推广的小伙伴们应该对APP渠道统计并不陌生吧.APP推广运营人员需要根据数据来评估渠道推广的效果,找到最适合自家APP的渠道,有针对性的投放,不断完善推广策略,这样才能更加精准.有效 ...

  8. 剑指Offer的学习笔记(C#篇)-- 替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 一 . 自己的想法 老实说,貌 ...

  9. 剑指Offer的学习笔记(C#篇)-- 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 一 . 二叉树的概念         树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可 ...

  10. 【实验吧】该题不简单——writeup

    题目地址:http://ctf5.shiyanbar.com/crack/3/ 一定要注意读题: 要求找出用户名为hello的注册码,这八成就是 要写注册机啊! ——————————————————— ...