사용자가 브라우저에서 파일 업로드 버튼을 눌러 업로드를 시도하면 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를 직접 구현해주면 됩니다.
'ASP.NET Blazor' 카테고리의 다른 글
Solved Blazor Unity Webgl Build.data 404 Not Found (2) | 2023.10.16 |
---|---|
ASP.NET MapDelete Api 에러 해결 (0) | 2023.10.11 |
Blazor/ASP.NET 구글 인증 로그인 기반 회원 가입 만들기 - 2. 회원가입 처리 (0) | 2023.08.23 |
Blazor/ASP.NET 구글 인증 로그인 기반 회원 가입 만들기 - 1. MongoDB 세팅 및 CRUD (0) | 2023.08.23 |
Blazor/ASP.NET 구글 인증 로그인 만들기 - 4. 구글 계정 정보 페이지에 띄우기 (0) | 2023.08.22 |