Как установить загрузку имени файла в веб-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");