Мне нужно прочитать кучу файлов с диска, архивировать их на лету и отправить в веб-интерфейс, заархивированные из потока памяти. Но каждый раз, когда я получаю ошибку, не удается закрыть поток, пока не будут записаны все байты.Отправить 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 также закрыт и не может быть отправлен. Что не так?