2012-04-25 10 views
2

서비스를 테스트하기 위해 피들 디버거에서 비디오 파일 .mov를 원격 웹 서비스에 업로드하려하지만 디스크에 저장된 파일이 손상되었습니다. 어떤 제안?바이너리 업로드 WCF가 손상되었습니다. .mov 파일

요청 헤더

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468 
User-Agent: Fiddler 
Host: localhost:2487 
Content-Length: 2113228 

요청 본문

---------------------------acebdf13572468 
Content-Disposition: form-data; name="IMG_0888.MOV"; filename="IMG_0888.MOV" 
Content-Type: video/quicktime 

<@INCLUDE *C:\Users\Amrit\Desktop\IMG_0888.MOV*@> 
---------------------------acebdf13572468-- 

C# 코드

 FileStream fs = null; 
      string UniqueId = this.GenerateUID(); 
      _fileDirectory = System.IO.Path.Combine(Constants._VideosDirectory,author_id); 
      if (!Directory.Exists(_fileDirectory)) 
      { 
       Directory.CreateDirectory(_fileDirectory); 
      } 
      string file = Path.Combine(_fileDirectory, "test.mov"); 
    //  string filePath = Path.Combine(uploadFolder, request.FileName); 

      try 
      { 
       using (FileStream targetStream = new FileStream(file, FileMode.Create, 
           FileAccess.Write, FileShare.None)) 
       { 
        //read from the input stream in 65000 byte chunks 

        const int bufferLen = 65000; 
        byte[] buffer = new byte[bufferLen]; 
        int count = 0; 
        while ((count = request.Read(buffer, 0, bufferLen)) > 0) 
        { 
         // save to output stream 
         targetStream.Write(buffer, 0, count); 
        } 
        targetStream.Close(); 
        return "done"; 
        //sourceStream.Close(); 
       } 
      } 


      catch (Exception) 
      { 
       return "fail"; 
      } 
      finally 
      { 

      } 
+3

은 전체 요청을 디스크에 저장하기 때문에 발생할 수 있습니다. 요청을 받아 들여 실제 파일 내용을 가져와야합니다. –

+0

고마워요 @AndrasZoltan – Amrit

답변

2

안드라스가 지적 하듯이, 당신이 디스크에 전체 요청을 절약하고 있습니다 만이 아니라 내용 ,하지만 더 많은 가능성이 유니 코드 바이트 순서 표시 (BOM) 파일의 시작 부분에 저장하는 것입니다 (어떤 일부 .NET 스트림에 의해 자동으로 수행됨).

먼저 수행해야 할 일은 저장된 파일의 길이를 원본 파일의 길이로 확인하는 것입니다. 새 파일은 길이가 3 바이트 더 길어질 가능성이 높습니다. 이는 BOM이 추가되었음을 나타냅니다.

확인하려면 두 파일을 16 진수 편집기에서 열고 내용이 어떻게 보이는지 살펴본 다음 원본 파일과 비교하십시오. 두 개의 16 진수 파일을 비교할 때 처음 몇 글자와 마지막 몇 글자 만보아야합니다. (마지막 줄이 다르면 스트림이 완료되지 않고 파일이 잘 렸습니다. 첫 번째가 다른 경우 BOM이있는 경우 붙여진).

대신 File.WriteBytes을 사용해야하는 경우 BOM이 포함되지 않습니다.

+0

저에게 도움이 된 @Seph, HTTP는 스트림을 파싱하고 FileContents를 바이트로 가져와 File.WriteBytes를 사용했습니다 – Amrit

+0

스트림에서 헤더를 어떻게 제거 하시겠습니까? 이 문제는 .zip을 업로드하고 http 헤더가 포함 된 파일을 저장합니다. – guiomie