ASP.NET 웹 API에서 다운로드 파일 이름을 설정하는 방법 다음과 같은 메서드가 있습니다. public

내 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)