본문 바로가기

ASP.NET Blazor

ASP.NET 파일 업로드 파일 데이터 손상 문제 해결 OpenReadStream, ReadAsync, InputFileChangeEventArgs

사용자가 브라우저에서 파일 업로드 버튼을 눌러 업로드를 시도하면 InputFileCahngeEventArgs 매개변수를 통해 받아오게 됩니다.

 

그렇게 얻은 파일 데이터를 파일 서버로 전송하기 위해 ReadAsync 함수를 호출하여 바이트로 변환해야 합니다.

어느정도 작은 파일(32KB 이하)을 두고 테스트할 때는 정상적으로 동작되어 이상이 없는 줄 알았습니다.

 

비교적 큰 파일을 업로드하고 파일 서버에서 해당 파일을 다시 다운로드하여 상태를 확인해 보니, 파일이 손상되어 있었습니다. 브라우저 환경이 아닌 실행프로그램으로 작성한 테스트 코드에서는 정상적으로 동작하여 파일 조각 모음(대용량 파일 처리로 인한 별도의 로직)시 손상된 줄 알았습니다.

 

그렇게 한시간 가량 디버깅을 하였고 원인을 찾았습니다.

Stream.ReadAsync 함수가 파일의 데이터를 알아서 끝까지 읽어주는 줄 알았으나, 어느정도 읽다가 말아버리는 것을 확인했습니다.

 

따라서, 파일의 총 길이와 현재까지 읽은 길이를 비교하여 끝까지 읽도록 로직을 작성해야 했습니다.

실행프로그램으로 작성했던 코드에서 문제가 발생하지 않았던 것은, 파일을 끝까지 읽어주는 File.ReadAllBytes 함수를 사용했기 때문입니다.

 

Stream.ReadAsync 예제 코드에서 딱히 이러한 문제 요소를 발견하지 못했기 때문에 전혀 의심치 않았던 것 같습니다.

 

byte[] b = new byte[stream.Length];
int readOffset = 0;
		
while (readOffset < stream.Length)
{
    int readByte = await stream.ReadAsync(b, readOffset, (int)stream.Length - readOffset);
    readOffset += readByte;
}

 

따라서 Stream용 ReadAllBytes를 직접 구현해주면 됩니다.