• C# 之 向服务器上传资源


      首先写客服端,winform 应用 或者 WPF 应用 模拟一个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(" --" + strBoundary + " "); //请求头部信息 StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append(" "); sb.Append("Content-Disposition: form-data; name=""); sb.Append("file"); sb.Append(""; filename=""); sb.Append(saveName); sb.Append("";"); sb.Append(" "); sb.Append("Content-Type: "); sb.Append("application/octet-stream"); sb.Append(" "); sb.Append(" "); 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; }
      接收文件的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="300000"/>

      不修改配置,默认最大只能上传4M了。要是想上传更大的文件,maxRequestLength(KB),executionTimeout(毫秒)设置大些,另外别忘了看看IIS的连接超时是否设置为足够大。

      注意:IIS7及以后的 Web.config 的配置方式与之前略有不同。见:IIS 之 通过 Web.config 修改文件上传大小限制设置方法 。

  • 相关阅读:
    css实现文字渐变
    js 模拟window.open 打开新窗口
    在centos上安装nodejs
    css多行省略
    Vue 中渲染字符串形式的组件标签
    vue 中结合百度地图获取当前城市
    vue-cli 项目实现路由懒加载
    JavaScript学习-2循环
    早期自学jQuery-一入门
    JavaScript学习-1
  • 原文地址:https://www.cnblogs.com/xinaixia/p/5706125.html
Copyright © 2020-2023  润新知