2017-12-08 3 views
3

私はいくつかのバイト配列データでその場でzipストリームを作成し、それをMVCアクションを介してダウンロードしようとしています。ZipArchiveはデータ破損したエラーの予期しない終了を与えます

ただし、ダウンロードしたファイルは、Windowsで開くと常に次のような壊れたエラーが発生します。

enter image description here

そして、このエラー私は7zの

enter image description here

からxtractしかし、7Zから抽出されたファイルが破損していないことに注意してみてください。

私はZipArchiveを使用しています。以下は私のコードです。

private byte[] GetZippedPods(IEnumerable<POD> pods, long consignmentID) 
    { 
     using (var zipStream = new MemoryStream()) 
     { 
      //Create an archive and store the stream in memory.     
      using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) 
      { 
       int index = 1; 
       foreach (var pod in pods) 
       {       
        var zipEntry = zipArchive.CreateEntry($"POD{consignmentID}{index++}.png", CompressionLevel.NoCompression);      
        using (var originalFileStream = new MemoryStream(pod.ByteData)) 
        { 
         using (var zipEntryStream = zipEntry.Open()) 
         { 
          originalFileStream.CopyTo(zipEntryStream); 
         } 
        } 
       } 
       return zipStream.ToArray(); 
      } 
     } 
    } 

    public ActionResult DownloadPOD(long consignmentID) 
    { 
     var pods = _consignmentService.GetPODs(consignmentID); 
     var fileBytes = GetZippedPods(pods, consignmentID); 
     return File(fileBytes, MediaTypeNames.Application.Octet, $"PODS{consignmentID}.zip"); 
    } 

私はここで間違っています。

私は一日中これに苦しんでいるので、どんな助けも高く評価されます。事前に

おかげ

+3

を使用して 'zipArchive'の外側で' zipStream.ToArray() 'を移動します。 – john

+0

@johnあなたは素晴らしい友達です。ありがとうございました。それは魅力のように働いた。 –

答えて

4

移動zipArchivezipStream.ToArray()外使用。

問題の原因は、ストリームがバッファされているためです。

  • あなたはtrueにストリームのAutoFlushプロパティを設定することができます。それwtih対処するためのいくつかの方法があります。
  • .Flush()をストリーム上で手動で呼び出すことができます。

それとも、それはMemoryStreamだとあなたは.ToArray()を使用しているので、あなたは単にストリームは(私たちはusing外に移動してやったもの)最初/配置されているの閉じることができるようにすることができます。

+1

完璧!詳細な説明をありがとう! – ThatAwesomeCoder

関連する問題