当 C# 迭代 zipfile 时,HttpPostedFileBase 将内容长度设置为 0
HttpPostedFileBase gets content length to 0 when C# iterates the zipfile
我有一个 Web 界面,用户可以从本地计算机中选择许多文件之一并将它们上传到中央位置,在本例中为 Azure Blob Storage
。我检查了我的 C#
代码以验证文件名结尾是 .bin
。 C#
中的接收方法取一个HttpPostedFileBase
.
的数组
我想允许用户改为选择 zip 文件。在我的 C#
代码中,我遍历 zip 文件的内容并检查每个文件名以验证结尾是否为 .bin
。
但是,当我遍历 zip 文件时,HttpPostedFileBase
对象的 ContentLength
变为 0
(零),当我稍后将 zip 文件上传到 Azure
,它是空的。
如何在不操作 zip 文件的情况下检查文件名结尾?
- 我已尝试
DeepCopy
HttpPostedFileBase
的单个对象,但它不可序列化。
- 我试图复制
array
但没有任何效果。似乎一切都是参考而不是价值。我的代码的一些示例如下。是的,我单独尝试了这些台词。
private static bool CanUploadBatchOfFiles(HttpPostedFileBase[] files)
{
var filesCopy = new HttpPostedFileBase[files.Length];
// Neither of these lines works
Array.Copy(files, 0, filesCopy, 0, files.Length);
Array.Copy(files, filesCopy, files.Length);
files.CopyTo(filesCopy, 0);
}
这就是我遍历 zip 文件的方式
foreach (var file in filesCopy)
{
if (file.FileName.EndsWith(".zip"))
{
using (ZipArchive zipFile = new ZipArchive(file.InputStream))
{
foreach (ZipArchiveEntry entry in zipFile.Entries)
{
if (entry.Name.EndsWith(".bin"))
{
// Some code left out
}
}
}
}
}
我解决了我的问题。我必须做两件事:
首先,我不做数组的拷贝。相反,对于每个 zip 文件,我只复制流。这使得 ContentLength 保持原来的长度。
第二个 是在查看 zip 文件后重置位置。我需要这样做,否则我上传到 Azure Blob 存储的 zip 文件将为空。
private static bool CanUploadBatchOfFiles(HttpPostedFileBase[] files)
{
foreach (var file in files)
{
if (file.FileName.EndsWith(".zip"))
{
// Part one of the solution
Stream fileCopy = new MemoryStream();
file.InputStream.CopyTo(fileCopy);
using (ZipArchive zipFile = new ZipArchive(fileCopy))
{
foreach (ZipArchiveEntry entry in zipFile.Entries)
{
// Code left out
}
}
// Part two of the solution
file.InputStream.Position = 0;
}
}
return true;
}
我有一个 Web 界面,用户可以从本地计算机中选择许多文件之一并将它们上传到中央位置,在本例中为 Azure Blob Storage
。我检查了我的 C#
代码以验证文件名结尾是 .bin
。 C#
中的接收方法取一个HttpPostedFileBase
.
我想允许用户改为选择 zip 文件。在我的 C#
代码中,我遍历 zip 文件的内容并检查每个文件名以验证结尾是否为 .bin
。
但是,当我遍历 zip 文件时,HttpPostedFileBase
对象的 ContentLength
变为 0
(零),当我稍后将 zip 文件上传到 Azure
,它是空的。
如何在不操作 zip 文件的情况下检查文件名结尾?
- 我已尝试
DeepCopy
HttpPostedFileBase
的单个对象,但它不可序列化。 - 我试图复制
array
但没有任何效果。似乎一切都是参考而不是价值。我的代码的一些示例如下。是的,我单独尝试了这些台词。
private static bool CanUploadBatchOfFiles(HttpPostedFileBase[] files)
{
var filesCopy = new HttpPostedFileBase[files.Length];
// Neither of these lines works
Array.Copy(files, 0, filesCopy, 0, files.Length);
Array.Copy(files, filesCopy, files.Length);
files.CopyTo(filesCopy, 0);
}
这就是我遍历 zip 文件的方式
foreach (var file in filesCopy)
{
if (file.FileName.EndsWith(".zip"))
{
using (ZipArchive zipFile = new ZipArchive(file.InputStream))
{
foreach (ZipArchiveEntry entry in zipFile.Entries)
{
if (entry.Name.EndsWith(".bin"))
{
// Some code left out
}
}
}
}
}
我解决了我的问题。我必须做两件事:
首先,我不做数组的拷贝。相反,对于每个 zip 文件,我只复制流。这使得 ContentLength 保持原来的长度。
第二个 是在查看 zip 文件后重置位置。我需要这样做,否则我上传到 Azure Blob 存储的 zip 文件将为空。
private static bool CanUploadBatchOfFiles(HttpPostedFileBase[] files)
{
foreach (var file in files)
{
if (file.FileName.EndsWith(".zip"))
{
// Part one of the solution
Stream fileCopy = new MemoryStream();
file.InputStream.CopyTo(fileCopy);
using (ZipArchive zipFile = new ZipArchive(fileCopy))
{
foreach (ZipArchiveEntry entry in zipFile.Entries)
{
// Code left out
}
}
// Part two of the solution
file.InputStream.Position = 0;
}
}
return true;
}