[WebForm] 파일 다운로드 구현 (파일명 깨짐 해결)

2018. 11. 9. 15:18WEB/ASP.NET WebForm

ASP.NET WebForm에서 특정 이벤트 발생 시 파일다운로드는 아래와 같이 구현할 수 있습니다.

protected void lbtDownloadPdf_Click(object sernder, EventArgs e)
{
    //PDF다운로드 예제
    byte[] pdfByte = File.ReadAllBytes(Server.MapPath("~/Content/sample.pdf"));
    
    //1. IE, Edge 브라우저에서 파일명 깨짐 방지
    string fileName = "샘플PDF파일";
    string browser = Request.Browser.Type.ToUpper();
    string userAgent = Request.UserAgent.ToUpper();
    bool isIE = browser.StartsWith("IE") || browser.Contains("INTERNETEXPLORER") || userAgent.Contains("TRIDENT") || userAgent.Contains("MSIE");
    bool isEdge = userAgent.Contains("EDGE");
    if (isIE || isEdge)
        fileName = HttpUtility.UrlEncode(fileName, UTF8Encoding.UTF8).Replace("+", " ");

    //2. 파일 출력
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".pdf");
    Response.AddHeader("Content-Transfer-Encoding", "Binary");
    Response.BinaryWrite(pdfByte);
    Response.Flush();
    Response.SuppressContent = true;
    ApplicationInstance.CompleteRequest();
}
  1. IE, Edge에서는 파일명이 깨질 수 있으므로 URL Encoding 처리를 해주어야 합니다.
  2. ContentType은 octet-stream으로 설정하여 브라우저가 파일을 다운로드 받게 합니다.
  3. Content-Disposition을 통해 파일명을 설정할 수 있습니다.
  4. Reseponse.End()는 Exception이 발생하므로 Response.SuppressContent = true; ApplicationInstance.CompleteRequest();를 대신 사용하였습니다.


'WEB > ASP.NET WebForm' 카테고리의 다른 글

[ASP.NET] 파일순환참조는 허용되지 않습니다.  (0) 2015.03.13