2013-09-24 3 views
1

필드 중 하나에 파일이있는 couchbase에서 객체를 가져옵니다. 파일은 zip로 압축 된 후 base64로 인코딩됩니다.문자열에서 Zip 파일의 압축 해제

어떻게이 문자열을 가져 와서 원래 파일로 다시 압축을 풀 수 있습니까?

그렇다면 ASP.MVC 4를 사용하는 경우 - 어떻게 브라우저로 다운로드 가능한 파일로 다시 보내겠습니까?

원본 파일이 Linux 시스템에서 만들어지고 Windows 시스템 (C#)에서 디코딩됩니다.

답변

0

Convert.FromBase64String을 사용하여 바이트를 얻은 다음 압축을 풀고 Controller.File을 사용하여 클라이언트에서 파일을 다운로드하도록해야합니다. 압축을 풀려면 ZIP 라이브러리를 사용하여 zip 파일을 열어야합니다. .NET 4.5에 내장 된 ZipArchive 클래스가 작동해야합니다. 또는 다른 라이브러리 (SharpZipLibDotNetZip)를 스트림에서 읽을 수 있습니다.

public ActionResult MyAction() 
{ 
    string base64String = // get from Linux system 
    byte[] zipBytes = Convert.FromBase64String(base64String); 
    using (var zipStream = new MemoryStream(zipBytes)) 
    using (var zipArchive = new ZipArchive(zipStream)) 
    { 
     var entry = zipArchive.Entries.Single(); 
     string mimeType = MimeMapping.GetMimeMapping(entry.Name); 
     using (var decompressedStream = entry.Open()) 
      return File(decompressedStream, mimeType); 
    } 
} 

당신은 또한 파일의 MIME 타입을해야합니다, 당신은 당신이 가장 일반적인 유형의 것을 얻을 수 있도록 MimeMapping.GetMimeMapping를 사용할 수 있습니다.

+0

.NET 4.5에는 작동 할 ZipArchive 클래스가 포함되어 있다는 것을 깨달았습니다. 그 대답을 사용하도록 업데이트했습니다. 나는 그것을 시도하지 않았기 때문에, 당신이'byte []'또는'Stream'으로 엔트리를 읽는 것을 끝내는 방법을 재 작업해야 할 수도 있습니다. –

+0

완료! 매우 도움이됩니다. – JohnMighty

0

이전에이 유형의 작업에 성공적으로 SharpZipLib을 사용했습니다.

보기에 매우 가까운 예가 here입니다. MemoryStream을을 생성하고 그것에 문자열을 쓰기

  • 가 다시 찾아

    • 데이터베이스
    • 에서 문자열로 압축 입력을 얻을 :

      기본적 단계는 다음과 같이해야한다 메모리 스트림의 시작

    • MemoryStream을 SharpZipLib의 입력으로 사용 ZipFile 클래스
    • 위의 예제에 따라 th 전자 ZipFile를

    업데이트

    문자열이 파일 (안 전체 ZIP 아카이브)의 압축 된 내용을 포함하는 경우 다음 단순히 압축을 .NET에 GZipStream 클래스를 사용할 수 있습니다 내용. 샘플 here을 찾을 수 있습니다. 그러나 초기 단계는 위와 같습니다 (db로부터 문자열을 가져 와서 메모리 스트림에 쓰고 GZipStream의 입력으로 메모리 스트림을 압축 해제합니다).

  • +0

    감사합니다.하지만 꽤 오래된 것으로 보이며 문서가없는 것 같습니다./ – JohnMighty

    +0

    @JohnMighty - 아니요, 구식이 아닙니다. 꽤 널리 사용되고 샘플까지, 업데이트 된 답변의 링크를 살펴보십시오. –

    관련 문제