bestsource

스트리밍 대용량 파일이 ASP에 업로드됩니다.NET MVC

bestsource 2023. 9. 16. 09:31
반응형

스트리밍 대용량 파일이 ASP에 업로드됩니다.NET MVC

제가 작업 중인 애플리케이션의 경우, 사용자가 웹 사이트를 통해 매우 큰 파일(즉, 잠재적으로 수 기가바이트)을 업로드할 수 있도록 해야 합니다.아쉽게도 ASP.NET MVC는 서비스를 시작하기 전에 전체 요청을 RAM에 로드하는 것으로 보이는데, 이러한 애플리케이션에 정확히 이상적이지는 않습니다.특히 다음과 같은 코드를 통해 문제를 회피하려고 합니다.

if (request.Method == "POST")
{
    request.ContentLength = clientRequest.InputStream.Length;
    var rgbBody = new byte[32768];

    using (var requestStream = request.GetRequestStream())
    {
        int cbRead;
        while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
        {
            fileStream.Write(rgbBody, 0, cbRead);
        }
    }
}

요청 시 RAM에 대한 버퍼 심리를 회피하지 못합니다.이런 행동을 쉽게 해결할 수 있는 방법이 있을까요?

제 초기 코드가 기본적으로 정확했던 것으로 드러났습니다. 유일한 변경 사항은 변경하는 것이었습니다.

request.ContentLength = clientRequest.InputStream.Length;

로.

request.ContentLength = clientRequest.ContentLength;

콘텐츠 길이를 결정하기 위한 전체 요청의 이전 스트림; 후자는 단지 다음을 확인할 뿐입니다.Content-Length헤더 전체를 전송하기만 하면 되는 헤더입니다.이를 통해 IIS는 거의 즉시 요청 스트리밍을 시작할 수 있으며, 이를 통해 원래 문제를 완전히 제거할 수 있습니다.

그럼요, 할 수 있어요.HttpWebRequestIHttpHandler와 함께 RESTful 파일 업로드를 참조하십시오.저는 몇 년 전부터 이 방법을 사용하고 있으며 적어도 몇 기가바이트의 파일로 테스트를 거친 사이트가 있습니다.기본적으로, 당신은 자신만의 IHtpHandler를 만들기를 원하는데, 이것은 생각보다 쉽습니다.

즉, IHtpHandler 인터페이스를 구현하는 클래스를 생성하면 IsReuse 속성과 ProcessRequest 메서드를 지원해야 합니다.여기에 web.config에도 약간의 변화가 있어 매력적으로 작용합니다.요청 수명 주기의 이 단계에서는 업로드 중인 전체 파일이 메모리에 로드되지 않기 때문에 메모리 문제에서 깔끔하게 벗어납니다.

web.config에서는

<httpHandlers>
 <add verb="*" path="DocumentUploadService.upl" validate="false" type="TestUploadService.FileUploadHandler, TestUploadService"/>
</httpHandlers>

참조된 DocumentUploadService.upl 파일은 실제로 존재하지 않습니다.이는 단지 표준 핸들러가 요청을 가로채지 못하도록 대체 확장을 제공하기 위한 것입니다.파일 업로드 양식을 해당 경로로 가리키면 FileUploadHandler 클래스가 시작되고 실제로 파일을 받습니다.

업데이트: 사실 제가 사용하는 코드가 그 기사와 다르고, 작동하는 이유를 우연히 발견한 것 같습니다.HttpPostedFile 클래스를 사용합니다. 여기서 "파일은 MIME 다중 부분/양식 데이터 형식으로 업로드됩니다. 기본적으로 256KB보다 큰 폼 필드와 업로드된 파일을 포함한 모든 요청은 서버 메모리에 저장되지 않고 디스크로 버퍼링됩니다."

if (context.Request.Files.Count > 0)
{
    string tempFile = context.Request.PhysicalApplicationPath;
    for(int i = 0; i < context.Request.Files.Count; i++)
    {
        HttpPostedFile uploadFile = context.Request.Files[i];
        if (uploadFile.ContentLength > 0)
        {
            uploadFile.SaveAs(string.Format("{0}{1}{2}",
              tempFile,"Upload\\", uploadFile.FileName));
        }
    }
}

언급URL : https://stackoverflow.com/questions/1046230/streaming-large-file-uploads-to-asp-net-mvc

반응형