zoukankan      html  css  js  c++  java
  • C# 上传文件 造成内存溢出 解决方法

    上传文件,之前使用WebClient的上传方法,UploadFile方法容易造成内存溢出,UploadData方法又一直没搞定,所以借鉴下网友的方法
    文章主要内容源自(http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx),本文做些修改,使其可直接使用:
    原文链接:https://blog.csdn.net/u012790747/java/article/details/46052519

    public static string MyUploader(string strFileToUpload, string strUrl,Action<double,double> uploading)
    {
       string strFileFormName = "file";
       Uri oUri = new Uri(strUrl);
       string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
    
       // The trailing boundary string
       byte[] boundaryBytes = Encoding.ASCII.GetBytes("
    --" + strBoundary + "--
    ");
      //**注意此处的 strBoundary后的换行前加上--,不然会异常**
       // The post message header
       StringBuilder sb = new StringBuilder();
       sb.Append("--");
       sb.Append(strBoundary);
       sb.Append("
    ");
       sb.Append("Content-Disposition: form-data; name="");
       sb.Append(strFileFormName);
       sb.Append(""; filename="");
       sb.Append(Path.GetFileName(strFileToUpload));
       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);
    
       // The WebRequest
       HttpWebRequest oWebrequest = (HttpWebRequest)WebRequest.Create(oUri);
       oWebrequest.ContentType = "multipart/form-data; boundary=" + strBoundary;
       oWebrequest.Method = "POST";
    
       // This is important, otherwise the whole file will be read to memory anyway...
       oWebrequest.AllowWriteStreamBuffering = false;
    
       // Get a FileStream and set the final properties of the WebRequest
       FileStream oFileStream = new FileStream(strFileToUpload, FileMode.Open, FileAccess.Read);
       long length = postHeaderBytes.Length + oFileStream.Length + boundaryBytes.Length;
       oWebrequest.ContentLength = length;
       Stream oRequestStream = oWebrequest.GetRequestStream();
    
       // Write the post header
       oRequestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
    
       // Stream the file contents in small pieces (4096 bytes, max).
       byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)oFileStream.Length))];
       int bytesRead = 0;
       double size=0;
       while ((bytesRead = oFileStream.Read(buffer, 0, buffer.Length)) != 0)
          {
           oRequestStream.Write(buffer, 0, bytesRead);
           size+=bytesRead;
           if(uploading!=null)uploading(length ,size);
          }
        oFileStream.Close();
    
        // Add the trailing boundary
       oRequestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
       WebResponse oWResponse = oWebrequest.GetResponse();
       Stream s = oWResponse.GetResponseStream();
       StreamReader sr = new StreamReader(s);
       String sReturnString = sr.ReadToEnd();
    
        // Clean up
        oFileStream.Close();
        oRequestStream.Close();
        s.Close();
        sr.Close();
    
        return sReturnString;
    }
    ————————————————
    版权声明:本文为CSDN博主「小学徒再来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u012790747/java/article/details/46052519

    如果有增加取消功能,可以调用oWebrequest的Abort方法取消上传请求。

  • 相关阅读:
    不能执行已释放的Script的代码(ie错误)
    javascript数组
    Jquery遍历方法
    Jquery选择器汇总
    使用xmlHttprequest 发送异步请求(Ajax核心对象)
    不使用局部变量和for循环或其它循环打印出如m=19,n=2結果为2 4 8 16 16 8 4 2形式的串
    解决Js跨域访问的问题
    Oracle 第一天
    计算机图形学1——绪论
    数据库
  • 原文地址:https://www.cnblogs.com/qdmb/p/13336940.html
Copyright © 2011-2022 走看看