Na minha classe ApiController, tenho o seguinte método para baixar um arquivo criado pelo servidor.
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);
}
}
Tudo está funcionando perfeitamente, exceto que o nome do arquivo de download padrão é o seu ID, para que o usuário precise digitar seu próprio nome de arquivo ao salvar como caixa de diálogo a cada vez. Existe alguma maneira de definir um nome de arquivo padrão no código acima?
c#
asp.net-web-api
Tae-Sung Shin
fonte
fonte
Respostas:
Você precisa definir o
Content-Disposition
cabeçalho noHttpResponseMessage
:fonte
System.Net.Mime.ContentDisposition
ouContentDispositionHeaderValue
? Um é mais atual e mais preferido que o outro?ActionResult
, é paraHttpResponseMessage
ActionResult
e outro é para WebApiHttpResponseMessage
.EDIT: Como mencionado em um comentário, minha resposta não conta para caracteres que precisam ser escapados como a
;
. Você deve usar a resposta aceita por Darin, se o nome do arquivo puder conter um ponto-e-vírgula.Adicione um Response.AddHeader para definir o nome do arquivo
Apenas mude FILE_NAME para o nome do arquivo.
fonte
;
ou algo mais com um significado especial?Se você deseja garantir que o nome do arquivo seja codificado corretamente, mas também evite o WebApi HttpResponseMessage, use o seguinte:
Você pode usar ContentDisposition ou ContentDispositionHeaderValue. Chamar o ToString em uma instância de qualquer um deles fará a codificação dos nomes dos arquivos para você.
fonte
Eu acho que isso pode ser útil para você.
fonte
;
ou algo mais com um significado especial?Você precisa adicionar o cabeçalho de disposição do conteúdo à resposta:
fonte
;
ou algo mais com um significado especial?Se você estiver usando o ASP.NET Core MVC, as respostas acima são ligeiramente alteradas ...
No meu método de ação (que retorna
async Task<JsonResult>
), adiciono a linha (em qualquer lugar antes da declaração de retorno):fonte
Isso deve fazer:
fonte
;
ou algo mais com um significado especial?Nota: A última linha é obrigatória.
Se não especificarmos Access-Control-Expose-Headers , não obteremos o nome do arquivo na interface do usuário.
fonte
Considerando as respostas anteriores, é necessário ter cuidado com os caracteres globalizados.
Suponha que o nome do arquivo seja: " Esdrújula prenda ñame - güena.jpg "
Resultado bruto para o download: "Esdrújula prenda Amém - gena.jpg" [Feio]
Resultado HtmlEncode para download: "Esdr" - jula prenda & _241; ame - g & _252; ena.jpg "[Feio]
Resultado do UrlEncode para fazer o download: " Esdrújula + prenda + nome + - + güena.jpg " [OK]
Em seguida, você quase sempre precisa usar o UrlEncode sobre o nome do arquivo . Além disso, se você definir o cabeçalho de disposição do conteúdo como sequência direta, precisará garantir aspas entre aspas para evitar problemas de compatibilidade do navegador.
ou com auxílio de classe:
O System.Net.Mime. A classe ContentDisposition cuida de aspas.
fonte