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