Sto lavorando su come scaricare il file CSV da ASP.NET Web Api dalla chiamata jQuery ajax. Il file CSV viene generato dinamicamente dal server API Web basato su CsvFormatter personalizzato.Come scaricare il file CSV da ASP.NET Web Api utilizzando jQuery Ajax chiama
Ajax da jQuery:
$.ajax({
type: "GET",
headers: {
Accept: "text/csv; charset=utf-8",
},
url: "/api/employees",
success: function (data) {
}
});
Sul server, il EmployeeCsvFormatter
è implementato simile con in basso l'articolo, derivato da BufferedMediaTypeFormatter
:
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
public class EmployeeCsvFormatter : BufferedMediaTypeFormatter
{
public EmployeeCsvFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
}
...
}
Ho anche aggiunto metodo di sostituzione di indicare che mi piacerebbe scaricare come in un modo normale per scaricare il file (può vedere il download del file in download scheda):
public override void SetDefaultContentHeaders(Type type,
HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.Add("Content-Disposition", "attachment; filename=yourname.csv");
headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
}
Ma non funziona, il file di download non ha mostrato nella barra di stato o nella scheda scaricare su Chrome, anche se da Fiddler, vedo la risposta sembra corretto:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/11.0.0.0
Date: Mon, 11 Mar 2013 08:19:35 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=yourname.csv
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/octet-stream
Content-Length: 26
Connection: Close
1,Cuong,123
1,Trung,123
Il mio metodo da ApiController:
public EmployeeDto[] Get()
{
var result = new[]
{
new EmployeeDto() {Id = 1, Name = "Cuong", Address = "123"},
new EmployeeDto() {Id = 1, Name = "Trung", Address = "123"},
};
return result;
}
Si deve essere da qualche parte sbagliata che non ho capito. Come posso farlo funzionare scaricando il file CSV come normale?
non può scaricare su file con AJAX. Basta reindirizzare l'utente a url 'window.location = url', se il server forza il download non lascerà la pagina corrente – charlietfl
@charlietfl: come posso impostare l'intestazione Accept in questo modo? –
cosa ti aspetti con 'accept header'? Non è possibile forzare l'utente ad accettare nulla con download – charlietfl