2013-01-08 92 views
4

创建在从字节数组控制器zip文件和我返回zip文件作为fileresult。当我下载zip文件并提取文件时,它已损坏。我做这样说:压缩文件与dotnetzip,并且当打开时它已损坏

byte[] fileBytes =array 
MemoryStream fileStream = new MemoryStream(fileBytes); 
MemoryStream outputStream = new MemoryStream(); 
fileStream.Seek(0, SeekOrigin.Begin); 

using (ZipFile zipFile = new ZipFile()) 
{ 
    zipFile.AddEntry(returnFileName, fileStream); 
    zipFile.Save(outputStream); 
} 

outputStream.Position = 0; 

FileStreamResult fileResult = new FileStreamResult(outputStream, System.Net.Mime.MediaTypeNames.Application.Zip); 
fileResult.FileDownloadName = returnFileName + ".zip"; 

return fileResult; 
+0

下载的文件是否包含任何内容? – mortb

+0

是,包含文件,但是当你打开它已损坏 – user1957868

+0

该文件是一个XML文件,当我打开它,我得到的东西,如:!k来‡Vá2Ž™[CONTENT_TYPES] .XML¢(¼•MOA @†I&þ ‡f¯†.'bŒ¡xðã¨$bâuítÃ[email protected]ø÷n·XA^合肥;ó¾ÏÎt§ƒë¥NU * GOE»[:!©ì''ÏãûÎ%E“•B;²ëáéÉ相反原始xmlf文件 – user1957868

回答

0
public class HomeController : Controller 
{ 
    public FileResult Index() 
    { 
     FileStreamResult fileResult = new FileStreamResult(GetZippedStream(), System.Net.Mime.MediaTypeNames.Application.Zip); 
     fileResult.FileDownloadName = "result" + ".zip"; 
     return fileResult; 
    } 

    private static Stream GetZippedStream() 
    { 
     byte[] fileBytes = Encoding.ASCII.GetBytes("abc"); 
     string returnFileName = "something"; 

     MemoryStream fileStream = new MemoryStream(fileBytes); 
     MemoryStream resultStream = new MemoryStream(); 

     using (ZipFile zipFile = new ZipFile()) 
     { 
      zipFile.AddEntry(returnFileName, fileStream); 
      zipFile.Save(resultStream); 
     } 

     resultStream.Position = 0; 
     return resultStream; 
    } 
} 
+0

THX我会检查后,如果对我的作品 – user1957868

+0

在这种方式下创建一个文件,我不想和反正结果已损坏。你试过打开文件一旦下载?和其他事情我的返回类型必须是FileStreamResult因为是一个控制器,所以我必须做一些事情像FileStreamResult fileResult =新FileStreamResult(fileResultStream,System.Net.Mime.MediaTypeNames.Application.Zip); – user1957868

+0

是的,我可以打开该文件的内容是不是贪官,我编辑我的答案,包括。控制器代码。 – shamp00

3

你可能会不走运击中开放的错误之一DotNetZip。有例如取决于文件大小的问题(https://dotnetzip.codeplex.com/workitem/14087)。

不幸的是,DotNetZip有一些关键问题,该项目似乎不再积极维护。更好的替代方法是使用SharpZipLib(如果您遵守其基于GPL的许可证)或.NET ports of zlib之一。

如果你在.NET 4.5,你可以在System.IO.Compression命名空间中的内置类。下面的示例可以在ZipArchive类的文档中找到:

using System; 
using System.IO; 
using System.IO.Compression; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var zipToOpen = 
       new FileStream(@"c:\tmp\release.zip", FileMode.Open)) 
      { 
       using (var archive = 
        new ZipArchive(zipToOpen, ZipArchiveMode.Update)) 
       { 
        var readmeEntry = archive.CreateEntry("Readme.txt"); 
        using (var writer = new StreamWriter(readmeEntry.Open())) 
        { 
          writer.WriteLine("Information about this package."); 
          writer.WriteLine("========================"); 
        } 
       } 
      } 
     } 
    } 
} 
+0

即时通讯不使用4.5,我无法迁移。但无论如何,我不认为这是我的情况,因为帽子错误将只与具体files.Outly发生。但我与大家的问题 – user1957868

+0

System.IO.Compression woot! –

相关问题