2012-10-02 30 views
0

我已经(尝试)自定义我在Stackoverflow上找到的方法,以启用一个XML文件和多个图像的分段上传,以处理HTTPWebRequest出Sharepoint WebPart。对于我的耻辱,我说我真的不熟悉HttpRequest和StreamUpload的事情,这是我第一次认真地尝试处理这个问题。c#ASP HttpWebRequest分段上传XML和图像

Here`s我的编码:

public XmlDocument DoHttpUploadFile(string url, string[] file, string[] paramName, string[] contentType, NameValueCollection nvc, NameValueCollection headerItems, string xmlFileName) 
    { 
     var xmlDox = new XmlDocument(); 
     var totalLength = 0; 
     string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
     byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 
     const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 

     // First Loop is just need to get the Length of all Parts 

     for (int i = 0; i < file.Length; i++) 
     { 
      string header = ""; 
      if (i == 0) 
      { 
       header = string.Format(headerTemplate, paramName[i], xmlFileName, contentType[i]); 
      } 
      else 
      { 
       var filename = Path.GetFileName(file[i]); 
       header = string.Format(headerTemplate, paramName[i], filename, contentType[i]); 
      } 

      byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 

      var headerLength = headerbytes.Length; 
      var boundaryLength = boundarybytes.Length; 

      totalLength = totalLength + headerLength + boundaryLength; 

      if (file[i].StartsWith("<")) 
      { 
       byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(file[i]); 
       var xmlLength = xmlBytes.Length; 
       totalLength = totalLength + xmlLength; 
      } 
      else 
      { 
       var client = new WebClient(); 
       var img = new Image { ImageUrl = file[i] }; 

       client.UseDefaultCredentials = true; 
       // image as Byte into Stream 
       var fileData = client.DownloadData(img.ImageUrl); 
       var imgLength = fileData.Length; 
       totalLength = totalLength + imgLength; 
      } 
     } 

     var wr = (HttpWebRequest)WebRequest.Create(url); 

     wr.ContentType = "multipart/form-data; boundary=" + boundary; 
     wr.Method = "POST"; 
     wr.ContentLength = totalLength; 

     Stream rs = wr.GetRequestStream(); 
     var read = 0; 
     var finalLength = 0; 

     for (int i = 0; i < file.Length; i++) 
     { 
      string header = ""; 
      if(i==0) 
      { 
       header = string.Format(headerTemplate, paramName[i], xmlFileName, contentType[i]); 
      } 
      else 
      { 
       var filename = Path.GetFileName(file[i]); 
       header = string.Format(headerTemplate, paramName[i], filename, contentType[i]); 
      } 

      rs.Write(boundarybytes, 0, boundarybytes.Length); 

      byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 

      var headerLength = headerbytes.Length; 
      var boundaryLength = boundarybytes.Length; 
      finalLength = finalLength + headerLength + boundaryLength; 
      rs.Write(headerbytes, 0, headerbytes.Length); 

      if(file[i].StartsWith("<")) 
      { 
       var writer = new StreamWriter(rs); 
       byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(file[i]); 
       var xmlLength = xmlBytes.Length; 
       finalLength = finalLength + xmlLength; 
       writer.Write(file[i]); 
      } 
      else 
      { 
       var getitem = new GetItemFromList(); 

       var client = new WebClient(); 
       var img = new Image {ImageUrl = file[i]}; 

       client.UseDefaultCredentials = true; 
       // image as Byte into Stream 
       var fileData = client.DownloadData(img.ImageUrl); 
       finalLength = finalLength + fileData.Length; 
       rs.Write(fileData, 0, fileData.Length); 
      } 

     } 

     finalLength.ToString(); 
rs.Close(); // Here it stops with Exception 'Bytes are not completely written 



     WebResponse wresp = null; 
     try 
     { 
      wresp = wr.GetResponse(); 
      var wrlength = wr.ContentLength; 
      var stream2 = wresp.GetResponseStream(); 
      if (stream2 != null) 
      { 
       var reader2 = new StreamReader(stream2); 
       var backstr = reader2.ReadToEnd(); 

       xmlDox.LoadXml(backstr); 
      } 
     } 
     catch (Exception ex) 
     { 
      //log.Error("Error uploading file", ex); 
      if (wresp != null) 
       wresp.Close(); 
      wresp = null; 
     } 
     finally 
     { 
      wr = null;   } 

     return xmlDox; 
    } 

它停在rs.Close与异常“不能关闭流字节不writen完整”。

我想也许这取决于wr.ContentLength并试图手动设置它,就像你在上面的编码部分看到的一样。

我无法找到一个解决方案,我试了最后两天,并搜索了所有的网络,特别是stackeOverflow。

所以,如果有人能告诉我哪里出了问题,pleeeease告诉我,thx。 “

回答

0

”抛出异常是因为你写的字节数少于WebRequest的预期值。例如,如果在ContentLength属性中设置了75个字节,并且在ResquestStream中写入69个字节并关闭它,则会引发异常。 “

看到这个职位:Cannot close stream until all bytes are written

你可以检查TotalLength的确保您正在使用的字节长度,并确认在调试器的大小?