Preciso enviar um arquivo CSV na resposta HTTP. Como posso definir a resposta de saída como formato CSV?
Isto não está a funcionar:
Response.ContentType = "application/CSV";
Preciso enviar um arquivo CSV na resposta HTTP. Como posso definir a resposta de saída como formato CSV?
Isto não está a funcionar:
Response.ContentType = "application/CSV";
Respostas:
Usar text/csv
é o tipo mais apropriado.
Você também deve considerar adicionar um Content-Disposition
cabeçalho à resposta. Geralmente, um texto / csv é carregado por um Internet Explorer diretamente em uma instância hospedada do Excel. Isso pode ou não ser um resultado desejável.
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
O exemplo acima fará com que apareça uma caixa de diálogo "Salvar como", que pode ser o que você pretende.
Ao longo dos anos, aprimorei um conjunto perfeito de cabeçalhos para isso, que funcionam brilhantemente em todos os navegadores que conheço.
// these headers avoid IE problems when using https:
// see http://support.microsoft.com/kb/812935
header("Cache-Control: must-revalidate");
header("Pragma: must-revalidate");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$filename.csv");
Experimente um desses outros tipos MIME (a partir daqui: http://filext.com/file-extension/CSV )
Além disso, o tipo MIME pode fazer distinção entre maiúsculas e minúsculas ...
Basta usar assim
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
para obter o nome do arquivo. Caso contrário, o IE tentará salvar o arquivo como ActionName.htm
.
No ASP.net MVC, você pode usar ae FileContentResult
o File
método:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
Descobri que o problema com o IE é que ele fareja os dados de retorno e decide por qual tipo de conteúdo ele acha que foi enviado. Há vários efeitos colaterais que isso causa, como abrir sempre uma caixa de diálogo saveAs para arquivos de texto porque você está usando a compactação de transferências de dados. A solução é (em código php) ......
header('X-Content-Type-Options: nosniff');
A configuração do tipo e da disposição do conteúdo, conforme descrito acima, produz resultados extremamente variados com diferentes navegadores:
IE8: Caixa de diálogo SaveAs, conforme desejado, e Excel como o aplicativo padrão. 100% bom.
Firefox: o diálogo SaveAs aparece, mas o Firefox não faz ideia de que é uma planilha. Sugere abri-lo com o Visual Studio! 50% bom
Chrome: as dicas são totalmente ignoradas. Os dados CSV são mostrados no navegador. 0% bom.
É claro que em todos esses casos estou me referindo aos navegadores quando saem da caixa, sem personalização dos mapeamentos mime / application.
Para o C # MVC 4.5, você precisa fazer o seguinte:
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult(); //this line is important else it will not work.