programing

왜 아약스 요청을 사용하여 파일을 다운로드 할 수 없습니까?

fastcode 2023. 3. 31. 22:52
반응형

왜 아약스 요청을 사용하여 파일을 다운로드 할 수 없습니까?

애플리케이션에서는, 다음의 시나리오를 실장할 필요가 있습니다.

  1. 클라이언트에서 요청이 전송되었습니다.
  2. 서버가 요청을 처리하여 파일을 생성합니다.
  3. 서버가 응답으로 파일을 반환함
  4. 클라이언트 브라우저에 파일 다운로드 팝업 대화상자가 표시되며 사용자가 파일을 다운로드할 수 있습니다.

어플리케이션은 Ajax 기반 어플리케이션이기 때문에 Ajax 요청을 보내는 것이 매우 쉽고 편리할 것입니다(예를 들어,jquery.ajax()기능).

그러나 구글 검색 결과 파일 다운로드가 가능한 것은 (이 일반적인 SO 스레드에서 설명한 처럼) 비 ajax POST 요청을 사용하는 경우뿐입니다.그 때문에, 보다 추악하고 복잡한 솔루션을 실장할 필요가 있었습니다.이 솔루션에서는, 다음의 HTML 구조를 구축할 필요가 있었습니다.form숨김 필드가 중첩되어 있습니다.

왜 파일 다운로드에 Ajax 요청을 사용할 수 없는지 알기 쉽게 설명해 주시겠습니까?그 배후에 있는 기계들은 무엇입니까?

AJAX가 아니라물론 AJAX로 파일을 다운로드할 수 있습니다.다만, 파일은 메모리에 보존됩니다.즉, 디스크에 파일을 보존할 수 없습니다.이는 JavaScript가 디스크와 상호 작용할 수 없기 때문입니다.이는 심각한 보안 문제로 모든 주요 브라우저에서 차단됩니다.

이것은 Blob이라고 불리는 새로운 HTML5 기능을 사용하여 수행할 수 있습니다.이 기능 위에 래퍼로 사용할 수 있는 라이브러리의 FileSaver.js가 있습니다.

그건 이틀 전에 내가 스스로에게 물었던 것과 같은 질문이다.클라이언트가 ExtJ를 사용하여 작성한 프로젝트가 있었고 서버 측 실현은 ASP에 있었습니다.넷 서버 측을 자바 측으로 변환해야 합니다.클라이언트의 Ajax 요청 후 서버가 생성하는 XML 파일을 다운로드하는 기능이 있었습니다.Ajax 요청 후 파일을 다운로드하는 것은 불가능하며, 단지 메모리에 저장하는 것은 불가능하다는 것을 우리는 모두 알고 있습니다.그렇지만.....원래 응용 프로그램브라우저에 일반적인 대화상자가 표시되며 다운로드가 열려 저장 및 취소됩니다.ASP.Net은 표준 동작을 변경했습니다...다시 증명하는 데 이틀이 걸립니다.일반적인 방법으로 파일을 다운로드 할 수 있는 방법은 없습니다.유일한 예외는 ASP입니다.넷... 여기 ASP가 있어요.인터넷 코드

public static void WriteFileToResponse(byte[] fileData, string fileName)
    {
        var response = HttpContext.Current.Response;

        var returnFilename = Path.GetFileName(fileName);
        var headerValue = String.Format("attachment; filename={0}", 
            HttpUtility.UrlPathEncode(
                String.IsNullOrEmpty(returnFilename) 
                    ? "attachment" : returnFilename));
        response.AddHeader("content-disposition", headerValue);
        response.ContentType = "application/octet-stream";
        response.AddHeader("Pragma", "public");

        var utf8 = Encoding.UTF8;
        response.Charset = utf8.HeaderName;
        response.ContentEncoding = utf8;
        response.Flush();
        response.BinaryWrite(fileData);
        response.Flush();
        response.Close();
    }

이 메서드는 WebMethod에서 호출되어 ExtJ에서 호출되었습니다.Ajax.요구.그게 마법이야.난 뭐 어때, 난 서블릿으로 끝났고 숨겨진 iframe...

다운로드 페이지에서 숨겨진 iframe을 사용하여 이 작업을 수행할 수 있습니다.

숨겨진 ifame의 src를 ajax 성공 응답에 설정하면 작업이 완료됩니다.

  $.ajax({
        type: 'GET',
        url: './page.php',
        data: $("#myform").serialize(),
        success: function (data) {
          $("#middle").attr('src','url');
        },

});

언급URL : https://stackoverflow.com/questions/14682556/why-threre-is-no-way-to-download-file-using-ajax-request

반응형