C# 向服务器上传文件(客服端winform、服务端web)

转载

首先写客服端,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 = 0;     // 要上传的文件
            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 = 300000;
            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 = 0;
                progressBar.Value = 0;
                //每次上传4k
                int bufferLength = 4096;
                byte[] buffer = new byte[bufferLength]; //已上传的字节数
                long offset = 0;         //开始上传时间
                DateTime startTime = DateTime.Now;
                int size = r.Read(buffer, 0, bufferLength);
                Stream postStream = httpReq.GetRequestStream();         //发送请求头部消息
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                while (size > 0)
                {
                    postStream.Write(buffer, 0, 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 / 1024 / 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, 0, bufferLength);
                }
                //添加尾部的时间戳
                postStream.Write(boundaryBytes, 0, 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 = 1;
                }
                else if (sReturnString == "Error")
                {
                    returnValue = 0;
                }
            }
            catch
            {
                returnValue = 0;
            }
            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 > 0)
        {
            try
            {
                HttpPostedFile file = Request.Files[0];
                //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. }
时间: 2024-07-28 20:22:23

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

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传. 问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦 直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于, 发送的时候使用"content-type" = "application/json"

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

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

web服务器上传文件过程

通过web服务器上传文件,需要提前准备好下面3步,然后才能通过第4步上传文件1.web服务器的配置 1.1 将代码src目录中的select.c文件的170行的REQUEST_TIMEOUT改为10*REQUEST_TIMEOUT 1.2 在buildroot中选中boa后保存编译,然后更新nfs_root中内容: 1.3 重启单板 1.4 配置/etc/boa/boa.conf文件 1.4.1 屏蔽掉Group nobody,增加Group 0 1.4.2 去掉Errorlog前的屏蔽 1.4

模拟php curl向远程服务器上传文件

test.php: <?php header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = array('img'=>'@'. dirname(__FILE__).'/img/1.jpg'); curl_setopt($ch,CURLOPT_URL,"http://localhost:8088/curl/get_img.php"); cur

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

报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status of 400 Bad Request 因为跨服务器上传文件,文件名中里面含有中文名称,所以报错,解决: 让文件服务器支持utf-8编码或者将文件名变成英文.(最好的就是根据时间加随机数 或者是UUID来命名) 简单版的jsersey上传 @RequestMapping("/fileupload3&

20150220 Comet反向Ajax技术-在线客服系统之服务端

20150220 Comet反向Ajax技术-在线客服系统之服务端 2015-02-20 李海沿 前面我们讲了comet反向Ajax模型原理 以及实现了简单的实时页面聊天系统. (地址:http://www.cnblogs.com/lihaiyan/p/4281049.html) 本文中,我们在它的基础上来实现一个在线客服系统的服务端. 一.搭建页面客服系统框架 1.首先新建一个kefu.html网页 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01

struts2之如何向服务器上传文件

转载请注明:http://blog.csdn.net/uniquewonderq 问题:在struts2框架下实现文件上传 方案:struts2提供了拦截器可以自动实现文件上传,并且该拦截器存在于defaultStack中,是每个action默认使用的.复用之前的案例. 步骤一:打开上传页面 在struts.xml中,配置打开上传页面的action,代码如下: </pre><pre name="code" class="html"><?

关于nutz跨服务器上传文件

发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器.项目中功能使用form表单上传 @At @AdaptBy(type = UploadAdaptor.class, args = { "${app.root}/WEB-INF/tmp" }) public String add(@Param("upload_file")TempFile f, HttpS

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

1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动PSCP工具 首先需要保证在命令行下可以访问到pscp.exe.可以通过配置Windows的环境变量Path,或者直接通过命令行访问到pscp.exe. 首先进入到当前目录下: 例如:在windows系统下面: 之后开始传输文件到Linux服务器上 格式:pscp 文件 用户名@LinuxIP:目录