2010-08-18 3 views
2

파일 업로드가 포함 된 브라우저에서 POST를 허용하는 작은 클래스가 있습니다. . 나는 몸에 도착할 때 나는에서는 StreamReader를 사용하고있어 그것을 읽고 난 헤더를 읽을 다음, 그 위에 다음 stream.ReadBlock() 컨텐츠 길이를받을 수 있도록 크기의 배열을 만들고 :StreamReader 이진 파일에서 ReadBlock이 멈 춥니 다

char[] buffer = new char[contentLength]; 
stream.ReadBlock(buffer, 0, contentLength); 
String body = new string(buffer); 

때 이것을 실행하고 POST로 텍스트 파일을 작성하면 정상적으로 작동합니다. 그러나 ZIP 파일과 MP3 파일을 모두 시도했지만 그 중 어느 것도 작동하지 않았습니다. 전화가 stream.ReadBlock() 인 경우에만 작동합니다.

우분투 10.04에서 Mono 2.6.7을 사용해 보았습니다 (내 MonoDevelop 프로젝트는 .net 3.5를 사용하도록 설정 됨). 그리고 Visual Studio 2010 및 .net 3.5에서 동일한 프로젝트를 실행하여 Windows7에서도 동일한 작업이 수행되었음을 확인했습니다. Firefox와 Chrome 모두에서 게시를 시도했습니다.

누구에게 이런 일이 일어날 수 있는지 실마리가 있습니까? 감사.

은 또한 대신 위해 StreamReader의 BinaryReader를 사용하여 시도 :

byte[] bytes = reader.ReadBytes(contentLength); 

을하지만 지금은 무슨 일이 있어도 그 전화에 매달려하지 끝납니다. 내가 StreamReader를 사용하여 POST 헤더를 읽고 BinaryReader를 사용하여 본문을 읽었습니까?

답변

4

StreamReader텍스트 데이터입니다. 바이너리 데이터에는 사용하지 말아야합니다. BinaryReader 또는 Stream 만 사용해야합니다.

+0

BinaryReader를 사용하도록 바꿨으며 여전히 읽기가 멈췄습니다. – Joel

+0

@Joel : 새 코드를 표시하기 위해 질문을 업데이트해야합니다. –

+0

StreamReader가 텍스트 용이고 BinaryReader가 바이너리 용이라는 것을 알고 있습니다. 하지만 그것이 독서에 집착하는 이유를 설명합니까? textreader가 여전히 그것을 읽었을 뿐이고, 인코딩 등으로 내용을 망칠까요? – Joel

1

StreamReader를 사용하면 이진 파일에 적합하지 않습니다. 모든 종류의 텍스트 인코딩 작업을 수행하고 일반적으로 (잠재적으로) 작업을 망칠 것입니다.

작업중인 파일이 바이너리 인 것으로 판단되면 Stream 개체를 직접 사용하여 파일의 일부를 읽어야합니다. 그렇게하면 내용을 엉망으로 만드는 인코딩을 처리 할 필요가 없습니다.