下载zip文件ASP MVC的问题

时间:2016-07-12 19:02:20

标签: c# asp.net-mvc asp.net-mvc-4

我正在使用一个将一些文件压缩在一起的ASP MVC网站。它似乎工作,但当我尝试提取我得到的文件

An unexpected error is keeping you from copying the file. If you continue the receive this error, you can use the error code to search for help with this problem.
enter code here


Error 0x80004005: Unspecified error

7 Zip称CRC失败了。文件已损坏。

在编写或下载zip时,似乎有些东西被破坏了。我尝试了两种不同的方法来下载具有相同结果的文件。

public ActionResult DownloadFiles()
{
    List<string> files = GetFileList();
    using (ZipFile zip = new ZipFile())
    {
        foreach (string file in files)
            zip.AddFile(file, string.Empty);

        MemoryStream output = new MemoryStream();
        zip.Save(output);
        return File(output.ToArray(), "application/zip", "file.zip");
    }
}

public void DownloadFiles()
{
    List<string> files = GetFileList();
    using (ZipFile zip = new ZipFile())
    {
        foreach (string file in files)
            zip.AddFile(file, string.Empty);

        Response.Clear();
        Response.BufferOutput = false;
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "attachment; filename=file.zip");
        zip.Save(Response.OutputStream);
        Response.End();
    }
}

<button onclick="fn_DownloadFiles()">Download Selected</button>

function fn_DownloadSelectedFiles() 
{
    window.location.href = "/Files/DownloadFiles"
}

文件被破坏的原因是什么?

我也试过这个

public ActionResult DownloadFiles(string filePaths)
{
    List<string> files = GetFileList();
    using (MemoryStream zipStream = new MemoryStream())
    using (ZipArchive zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
    {
        foreach (string file in files)
        {
            ZipArchiveEntry entry = zipArchive.CreateEntry(file, CompressionLevel.Fastest);

            using (FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (Stream entryStream = entry.Open())
                fileStream.CopyTo(entryStream);
        }
        return File(zipStream.ToArray(), "application/zip", "files.zip"));
    }
}

有了这个我得到的Windows无法打开文件夹。压缩(压缩)的文件夹无效。

2 个答案:

答案 0 :(得分:1)

我使用以下代码进行了测试,并且没有发现任何问题。安装最新的NuGet包DotNetZip后,以下代码是一个完整的工作示例。我不知道GetFiles做了什么,所以我用一些我从硬编码目录中获取的文件替换它。我猜你的问题可能就在那里,所以也许你可以分享那些代码。同样,这是一个使用MVC控制器的测试,你已经说明了我只改变了一件事来表明没有问题

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using Ionic.Zip;

namespace MvcTesting.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            // replace C:\PickAFolderWithSomeFiles\ with a folder that has some files that you can zip to test
            List<string> files = System.IO.Directory.GetFiles(@"C:\PickAFolderWithSomeFiles\").ToList();
            using (ZipFile zip = new ZipFile())
            {
                foreach (string file in files)
                    zip.AddFile(file, string.Empty);

                using (MemoryStream output = new MemoryStream())
                {
                    zip.Save(output);
                    return File(output.ToArray(), "application/zip", "file.zip");
                }
            }
        }
    }
}

答案 1 :(得分:1)

您使用的是哪个版本的DotNetZip?最新版本中有一个错误。 尝试安装旧版本(1.9)并运行您的代码。如果它有效,那么bug仍然没有修复。

以下是工作项目的链接。 https://dotnetzip.codeplex.com/workitem/14087