将压缩文件发送到 Web API - 错误:在写入所有字节之前无法关闭流
本文关键字:字节 文件 压缩 Web 错误 API | 更新日期: 2023-09-27 18:32:11
我需要从磁盘读取一堆文件,将它们即时存档,然后发送到从内存流压缩的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());
}
}
}
}
错误
"在写入所有字节之前无法关闭流"
在client.PostAsync("Log/PostLog", content).Result;
如果我使用FileStream重新使用MemoryStream mZip,则此代码会保存正确的zip文件,因此我认为contenet长度没有问题。
如果我在发送前关闭 ZipOutputStream zipOStream,那么 MemoryStream mZip 也会关闭,无法发送。怎么了?
在添加到 StreamContent 之前,您必须将 Memory Stream 对象的 i.Zip.Postion 设置为零,如下所示
mZip.Position = 0 ;