2010-05-29 2 views
17

음, HttpWebResponse에서 파일을 다운로드하고 저장하려하지만 파일 (텍스트 파일 제외)을 올바르게 저장하는 데 문제가 있습니다.C# HTTP 요청에서 파일 저장

나는 그 무언가가이 부분을 함께 할 생각 : 위의 코드와

byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content); 
MemoryStream stream = new MemoryStream(byteArray); 

텍스트 파일 잘 작동하지만 저장하려고하면 이미지에 콘텐츠가 손상되면 파일. 가 어떻게

가 언급하는 것을 잊었다이 '문자열'이미지 파일 데이터 (및 기타 바이너리 파일)을 쓰기 수행이 .NET의 CP 3.5이고 나는 등

을 OAuth를 추가 할 HttpWebResponse 클래스 클래스 래퍼 클래스가
+1

실제로 파일에 쓰는 코드를 게시하십시오. 어쩌면 당신은 텍스트 모드로 그것을 쓰고있을 것입니다. 바이너리 모드로 작성해야합니다. – Senthil

+0

@Senthil : 아니요, 문제가되는 읽기 코드입니다.이 코드는 이미 표시되었습니다. –

+0

흠 .. 문제는 Encoding.UTF8.GetBytes() 부분입니까? – Senthil

답변

44

문제는 이진 데이터를 텍스트로 해석하는 것입니다. 그렇지 않은 경우에도 문제가 있습니다. 바이트 대신 문자열로 처리하기 시작하면 바로 문제가됩니다. 래퍼 클래스의 세부 정보를 제공하지는 않았지만 Content 속성이 문자열을 반환한다고 가정합니다. 사용하지 못할 것입니다. 래퍼 클래스가 웹 응답의 원시 데이터를 가져 오지 못하는 경우이를 수정해야합니다.

는 .NET 4를 사용하는 경우, 당신은 새로운하는 CopyTo 방법을 사용할 수 있습니다 : 당신은 .NET 4를 사용하지 않는 경우

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    input.CopyTo(output); 
} 

을 수동으로 복사 할 필요가 :

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 
+0

예치 그게 문제라고 생각했습니다. 자세한 내용 추가 (.NET Compact 3.5) – dkarzon

+0

@ d1k_is : 두 번째 코드 조각은 압축 된 프레임 워크에서 제대로 작동해야합니다 (출력 스트림을 변경하는 것 외에는 가능). –

+0

네, 그게 문제였습니다. 그래서 ContentStream 속성 대신 파일로 스트림을 읽을 수 있도록 httpresponse 래퍼를 수정해야했습니다. 감사! – dkarzon

7

WebClient.DownloadFile을 사용하십시오. 수동으로 할 수도 있지만 (like this), WebClient가 간단한 다운로드를위한 최선의 방법입니다.

관련 문제