2013-09-20 3 views
0

Мне нужно прочитать кучу файлов с диска, архивировать их на лету и отправить в веб-интерфейс, заархивированные из потока памяти. Но каждый раз, когда я получаю ошибку, не удается закрыть поток, пока не будут записаны все байты.Отправить zip-файлы в Web API - Ошибка: не удается закрыть поток до тех пор, пока не будут записаны все байты

Мой код отлично работает, если я сохраню zip-файл на локальный диск, а затем откройте FileStream и отправлю его в WebAPI, но мне нужно сделать это на лету без сохранения. Вот мой код:

using (MemoryStream mZip = new MemoryStream()) 
{ 
    using (ZipOutputStream zipOStream = new ZipOutputStream(mZip)) 
    { 
     foreach (FileInfo fi in allFiles) 
     { 
      ZipEntry entry = new ZipEntry((fi.Name)); 
      zipOStream.PutNextEntry(entry); 
      FileStream fs = File.OpenRead(fi.FullName); 

      try 
      { 
       byte[] transferBuffer = new byte[1024]; 
       int bytesRead = 0; 
       do 
       { 
        bytesRead = fs.Read(transferBuffer, 0, transferBuffer.Length); 
        zipOStream.Write(transferBuffer, 0, bytesRead); 
       } 
       while (bytesRead > 0); 
      } 
      finally 
      { 
       fs.Close(); 
      } 
     } 

     using (var client = new HttpClient(new HttpClientHandler() { Credentials = new NetworkCredential(login, password) })) 
     { 
      using (var content = new MultipartFormDataContent()) 
      { 
       client.BaseAddress = new Uri(AppConfig.ServerApiURL);         
       var streamContent = new StreamContent(mZip); 
       streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
       { 
        FileName = "Filename.zip", Size = mZip.Length 
       }; 

       content.Add(streamContent); 
       var result = client.PostAsync("Log/PostLog", content).Result; 
       MessageBox.Show(result.StatusCode.ToString()); 
      } 
     } 
    } 
} 

Ошибка

"Cannot close stream until all bytes are written"

находится в client.PostAsync("Log/PostLog", content).Result; Если я Repalce MemoryStream mZip с FileStream этот код сохраняет надлежащий почтовый файл, так что я полагаю, что нет никаких проблем с длиной contenet.

Если я закрыл ZipOutputStream zipOStream перед отправкой, то MemoryStream mZip также закрыт и не может быть отправлен. Что не так?

ответ

0

Вы должны установить запоминающее устройство объект потока в mZip.Postion т.е. к нулю, как показано ниже, прежде чем добавить к StreamContent

mZip.Position = 0;