当 C# 迭代 zipfile 时,HttpPostedFileBase 将内容长度设置为 0

HttpPostedFileBase gets content length to 0 when C# iterates the zipfile

我有一个 Web 界面,用户可以从本地计算机中选择许多文件之一并将它们上传到中央位置,在本例中为 Azure Blob Storage。我检查了我的 C# 代码以验证文件名结尾是 .binC#中的接收方法取一个HttpPostedFileBase.

的数组

我想允许用户改为选择 zip 文件。在我的 C# 代码中,我遍历 zip 文件的内容并检查每个文件名以验证结尾是否为 .bin

但是,当我遍历 zip 文件时,HttpPostedFileBase 对象的 ContentLength 变为 0(零),当我稍后将 zip 文件上传到 Azure,它是空的。

如何在不操作 zip 文件的情况下检查文件名结尾?


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;
}