programing tip

ASP.NET 웹 API에서 다운로드 파일 이름을 설정하는 방법

itbloger 2020. 6. 27. 11:44
반응형

ASP.NET 웹 API에서 다운로드 파일 이름을 설정하는 방법


내 ApiController 클래스에는 서버에서 만든 파일을 다운로드하는 다음과 같은 메서드가 있습니다.

public HttpResponseMessage Get(int id)
{
    try
    {
        string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
        Stream file = new MemoryStream();
        Stream result = _service.GetMyForm(id, dir, file);
        if (result == null)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }
        result.Position = 0;
        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.OK;
        response.Content = new StreamContent(result);
        return response;
    }
    catch (IOException)
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

기본 다운로드 파일 이름이 ID이므로 사용자가 매번 다른 이름으로 저장 대화 상자에서 자신의 파일 이름을 입력해야한다는 점을 제외하면 모든 것이 완벽하게 작동합니다. 위 코드에서 기본 파일 이름을 설정하는 방법이 있습니까?


Content-Disposition헤더 를 설정해야 합니다 HttpResponseMessage:

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "foo.txt"
};

편집 : 의견에서 언급했듯이, 내 대답은처럼 탈출 해야하는 문자를 설명하지 않습니다 ;. 파일 이름에 세미콜론이 포함될 수있는 경우 Darin에서 허용 된 답변을 사용해야합니다.

파일 이름을 설정하려면 Response.AddHeader를 추가하십시오.

Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");

FILE_NAME을 파일 이름으로 변경하십시오.


파일 이름이 올바르게 인코딩되도록하고 WebApi HttpResponseMessage도 피하려면 다음을 사용할 수 있습니다.

Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());

ContentDisposition 또는 ContentDispositionHeaderValue를 사용할 수 있습니다. 두 인스턴스 중 하나에서 ToString을 호출하면 파일 이름 인코딩이 수행됩니다.


나는 이것이 당신에게 도움이 될 것이라고 생각합니다.

Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)

컨텐츠 처리 헤더를 응답에 추가해야합니다.

 response.StatusCode = HttpStatusCode.OK;
 response.Content = new StreamContent(result);
 response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
 return response;

ASP.NET Core MVC를 사용하는 경우 위의 답변은 약간 변경됩니다.

내 액션 메소드 (을 반환 async Task<JsonResult>)에서 라인을 반환합니다 (반환 문 앞의 아무 곳이나) :

Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");

이것은해야합니다 :

Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)

참고 : 마지막 줄은 필수입니다.

Access-Control-Expose-Headers를 지정하지 않으면 UI에서 파일 이름을 얻지 못합니다.

FileInfo file = new FileInfo(FILEPATH);

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = file.Name
};
response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

참고URL : https://stackoverflow.com/questions/12145390/how-to-set-downloading-file-name-in-asp-net-web-api

반응형