В моем классе 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);
}
}
Все работает отлично, за исключением того, что имя загружаемого файла по умолчанию - это его идентификатор, поэтому пользователю, возможно, придется каждый раз вводить свое собственное имя файла при сохранении как диалоговом окне. Есть ли способ установить имя файла по умолчанию в приведенном выше коде?
c#
asp.net-web-api
Тэ-Сун Шин
источник
источник
Ответы:
Вам нужно установить
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" };
источник
System.Net.Mime.ContentDisposition
илиContentDispositionHeaderValue
? Один более актуален и предпочтительнее другого?ActionResult
, другой заHttpResponseMessage
ActionResult
, а другой - для WebApiHttpResponseMessage
.РЕДАКТИРОВАТЬ: Как упоминалось в комментарии, мой ответ не учитывает символы, которые необходимо экранировать, например
;
. Вы должны использовать принятый ответ Дарина, если имя вашего файла может содержать точку с запятой.Добавьте 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)
источник
;
или что-то еще со специальным значением?Вам нужно добавить в ответ заголовок content-disposition:
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 , мы не получим имя файла в пользовательском интерфейсе.
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");
источник
Учитывая предыдущие ответы, необходимо быть осторожным с глобализированными персонажами.
Предположим, файл имеет имя: " Esdrújula prenda ñame - güena.jpg "
Необработанный результат для загрузки: "Esdrújula prenda à ± ame - güena.jpg" [Ugly]
HtmlEncode результат для загрузки: "Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg" [Ugly]
Результат URLEncode для загрузки: " Esdrújula + prenda + ñame + - + güena.jpg " [OK]
Затем вам почти всегда нужно использовать UrlEncode над именем файла . Более того, если вы установите заголовок content-disposition как прямую строку, вам необходимо заключить его в кавычки, чтобы избежать проблем с совместимостью браузера.
Response.AddHeader("Content-Disposition", $"attachment; filename=\"{HttpUtility.UrlEncode(YourFilename)}\"");
или с помощью класса:
var cd = new ContentDisposition("attachment") { FileName = HttpUtility.UrlEncode(resultFileName) }; Response.AddHeader("Content-Disposition", cd.ToString());
Файл System.Net.Mime. Класс ContentDisposition заботится о кавычках.
источник