Ótima pergunta ... e merece mais detalhes. Eu me encontro aqui como resultado de uma situação interessante. Estávamos entregando alguns anexos em pdf por meio do ambiente MVC3 / C #. Nosso código foi lançado e começamos a receber respostas de nossos clientes de que os downloads estavam se comportando de maneira estranha quando estavam usando o Chrome e o tipo de arquivo estava sendo convertido para 'pdf-, attachment.pdf-, anexo'. Sim ... você entendeu ... a coisa toda. Então, alguém poderia reescrevê-lo para ser apenas 'pdf' e o arquivo ainda salvaria intacto, mas que bagunça!
Então, para descrever a situação inicial, estávamos configurando o cabeçalho 'Content-Disposition' e retornando um FileContentResult ...
var cd = new System.Net.Mime.ContentDisposition
{
FileName = result.Attachment.FileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);
Parecia bom. Funcionou bem no IE. Então, fiz uma pesquisa e tentei implementar o FileStreamResult (mantendo o setter Content-Disposition):
MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));
Foi corrigido o problema no Chrome! Hmmm ... mas por que diabos eu deveria ter que pegar minha matriz de bytes perfeitamente boa e transmiti-la e depois devolvê-la por isso para que o nome do arquivo funcionasse corretamente?
Então veio o Violinista.
Com FileContentResult, recebi 2 disposições de conteúdo no cabeçalho. Com FileStreamResult, obtive 1.
FileContentResult acrescenta um cabeçalho de Disposição de Conteúdo ao fornecer o Nome do arquivo e o Chrome considera vários deste cabeçalho como um erro.
Reação estranha ... mas definitivamente uma que é boa de saber.
System.Web.MimeMapping.GetMimeMapping(filename)
para coletar o tipo mime se não puder acessá-lo facilmente.File
resultado significa definir suaFileDownloadName
propriedade, que define osContent-Disposition
cabeçalhos para você. E ele suporta corretamente nomes de arquivos utf-8, o que nãoContentDisposition
ajuda na classe (veja meu comentário aqui para mais detalhes).