Как установить загрузку имени файла в веб-API ASP.NET
В моем классе 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);
}
}
Все работает отлично, за исключением того, что имя загружаемого файла по умолчанию - это его идентификатор, поэтому пользователю может понадобиться набирать собственное имя файла при каждом сохранении в качестве диалога. Есть ли способ установить имя файла по умолчанию в коде выше?
Ответы
Ответ 1
Вам нужно установить заголовок 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"
};
Ответ 2
EDIT:
Как уже упоминалось в комментарии, в моем ответе не учитываются символы, которые должны быть экранированы как ;
. Вы должны использовать принятый ответ Дарин, если ваше имя файла может содержать точку с запятой.
Добавить Response.AddHeader для установки имени файла
Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");
Просто измените FILE_NAME на имя файла.
Ответ 3
Я думаю, что это может быть полезно для вас.
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
Ответ 4
Если вы хотите, чтобы имя файла было правильно закодировано, но также избегайте WebApi HttpResponseMessage, вы можете использовать следующее:
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());
Вы можете использовать ContentDisposition или ContentDispositionHeaderValue. Вызов ToString в экземпляре либо сделает кодировку имен файлов для вас.
Ответ 5
Вам нужно добавить заголовок содержимого в ответ:
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
return response;
Ответ 6
Это должно сделать:
Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)
Ответ 7
Если вы используете ASP.NET Core MVC, ответы, приведенные выше, немного изменены...
В моем методе действий (который возвращает async Task<JsonResult>
) я добавляю строку (в любом месте перед оператором return):
Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
Ответ 8
Примечание: последняя строка обязательна.
Если мы не указали Access-Control-Expose-Headers, мы не получим имя файла в пользовательском интерфейсе.
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");