2010-03-30 11 views
3

Windows Azure를 사용하여 문서 관리 시스템을 만들었으며 지금까지 문제가 해결되었습니다. 나는 asp.net 프런트 엔드를 통해 BLOB 저장소에 파일을 업로드하고 다운로드 할 수있었습니다.Windows Azure DownloadtoStream EOF 오류

지금 시도하려는 것은 사용자가 .zip 파일을 업로드 한 다음 해당 파일을 .zip 파일로 가져 와서 개별 파일로 저장할 수 있도록 허용하는 것입니다. 문제는 "ZipException이 처리되지 않았습니다" "헤더의 EOF"가 발생하고 이유를 알 수 없습니다.

저는 다른 많은 작업에 사용했던 ICSharpCode.SharpZipLib 라이브러리를 사용하고 있습니다.

는 여기에 기본 코드입니다 :

CloudBlob ZipFile = container.GetBlobReference(blobURI); 
MemoryStream MemStream = new MemoryStream(); 
ZipFile.DownloadToStream(MemStream); 
.... 
while ((theEntry = zipInput.GetNextEntry()) != null) 

그리고 내가 오류를 얻을 상태로 시작하는 라인입니다. 나는 충분한 시간이지나 갔는지 확인하기 위해 10 초의 수면 시간을 추가했다.

MemStream은 디버깅 할 때 길이가 있지만 zipInput은 경우에 따라 다르지만 항상 그런 것은 아닙니다. 항상 실패합니다.

도움 주셔서 감사합니다.

데이브

답변

2

그냥 임의의 추측,하지만 당신은 당신이 그것을 읽기 전에 0으로 다시 스트림을 추구해야합니까? 이미 그 일을하고 있는지 (또는 필요한 경우) 확실하지 않습니다.

+0

내가 한 일은 .Position = 0으로 설정되어 트릭을 수행 한 것 같습니다. 나는 당신의 찾는 대답이 같은 결과를 가져올 것이라고 생각합니다. 그래도 궁금한 점이 저에게는 그렇게 논리적이지 않습니다. – david

+0

글쎄, 모든 스트림 검색을 지원하지 않습니다. 예를 들어 웹 요청을 만든 다음 DownloadToStream()을 사용하여 Windows Azure 저장소의 비트를이 웹 요청으로 전송할 수 있습니다. 그것의 끝에서 처음으로 돌아가는 것을 찾는 것은 말이되지 않습니다. (비트는 이미 보내졌습니다). 항상 처음부터 다시 탐색 할 수는 없으므로 저장소 클라이언트 라이브러리는 스트림을 그대로 두는 것만으로 일관성있는 작업을 수행 할 수 있다고 생각합니다. – smarx

+0

나는 그것을 볼 수 있지만 다른 용도의 맥락에서는 논리적이지 않다. 나는 DownloadtoStream (response)의 downloadtostream 함수에 익숙하다. 하지만 응답이 자동으로 위치를 재설정합니다. 몰라. 적어도 그것은 작동하고있는 것처럼 보인다. – david

0

@Smarx 힌트가 나를 위해 속임수를 사용했습니다. zip 내부의 빈 파일을 피하기위한 핵심은 위치를 0으로 설정하는 것입니다. Azure blob을 포함하는 zip-stream을 브라우저에 전송하는 샘플 코드가 있습니다.

 var fs1 = new MemoryStream(); 
     Container.GetBlobReference(blobUri).DownloadToStream(fs1); 
     fs1.Position = 0; 

     var outputMemStream = new MemoryStream(); 
     var zipStream = new ZipOutputStream(outputMemStream); 

     var entry1 = new ZipEntry(fileName); 
     zipStream.PutNextEntry(entry1); 
     StreamUtils.Copy(fs1, zipStream, new byte[4096]); 
     zipStream.CloseEntry(); 

     zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream. 
     zipStream.Close();     // Must finish the ZipOutputStream before using outputMemStream. 

     outputMemStream.Position = 0; 

     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment;filename=" + zipFileName); 
     Response.OutputStream.Write(outputMemStream.ToArray(), 0, outputMemStream.ToArray().Length); 
     Response.End();