Especificando o nome do arquivo para PDF dinâmico em asp.net
Pergunta
Como posso especificar o nome do arquivo ao despejar dados no fluxo de resposta?
No momento estou fazendo o seguinte:
byte[] data= GetFoo();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.BinaryWrite(data);
Response.End();
Com o código acima, recebo "foo.aspx.pdf" como nome do arquivo para salvar.Parece que me lembro de poder adicionar um cabeçalho à resposta para especificar o nome do arquivo a ser salvo.
Solução
Adicione uma disposição de conteúdo ao cabeçalho:
Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf""");
Outras dicas
PARA SUA INFORMAÇÃO...se você usar "inline" em vez de "anexo", o arquivo será aberto automaticamente no IE.Em vez de solicitar ao usuário uma caixa de diálogo Abrir/Salvar.
Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName));
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf");
Por alguma razão, a maioria das respostas disponíveis nem parece tentar codificar o valor do nome do arquivo.Se o arquivo contiver espaços, ponto e vírgula ou aspas, pode não aparecer corretamente.
Parece que você pode usar o ContentDisposition
class para gerar um valor de cabeçalho correto:
Response.AppendHeader("Content-Disposition", new ContentDisposition
{
FileName = yourFilename
}.ToString());
Você pode conferir o código-fonte para ContentDisposition.ToString()
para confirmar se está tentando codificá-lo corretamente.
Aviso:Isso parece travar quando o nome do arquivo contém um travessão (não um hífen).Ainda não me preocupei em investigar isso.
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";")