2013-01-08 93 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! –

相關問題