C#迭代zipfile时,HttpPostedFileBase的内容长度为0

时间:2019-07-30 09:41:46

标签: c# unzip zipfile httppostedfilebase

我有一个Web界面,用户可以从本地计算机中选择多个文件之一,然后将其上传到中央位置(在本例中为Azure Blob Storage)。我在C#代码中进行了检查,以验证文件名结尾为.binC#中的接收方法采用HttpPostedFileBase的数组。

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

但是,当我遍历zipfile时,ContentLength对象的HttpPostedFileBase变成0(零),后来我将zipfile上传到Azure时,它是空的。

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

  • 我尝试DeepCopy的单个对象,但无法序列化。
  • 我尝试制作HttpPostedFileBase的副本,但是没有任何效果。似乎一切都是参考,而不是价值。我的代码的一些示例如下。是的,我分别尝试过线路。

array

这是我遍历zipfile的方式

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

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。我必须做两件事:

首先,我不复制阵列。相反,对于每个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;
}
相关问题