2009-05-22 9 views
5

Je voudrais créer un fichier texte pour l'exportation/téléchargement, comme un * .csv, à partir d'une application ASP.NET. Je sais environ Response.TransmitFile, mais je veux le faire sans créer et enregistrer un fichier physiquement sur le serveur. Est-ce possible? Est-ce que quelqu'un a fait quelque chose comme ça?Dans ASP.NET, comment faire en sorte que le navigateur télécharge le contenu de la chaîne dans un fichier? (C#)

+0

pourriez-vous être un peu plus précis? Voulez-vous dire que vous voulez prendre une chaîne et l'enregistrer dans un fichier sur le client et ne jamais créer un fichier sur le serveur? –

Répondre

1

Un fichier que vous n'avez pas encore enregistré est juste une variable chaîne ou un MemoryStream. Mais pour de grandes quantités de données, vous ne voulez probablement pas tout garder en mémoire. Que voulez-vous faire avec ce "fichier" une fois que vous l'avez?

+0

Je voudrais le télécharger –

13

Lorsque vous dites "Créer un fichier pour l'exportation", je comprends que vous voulez le rendre téléchargeable dans le navigateur. Si c'est le cas, voici un exemple.

public void btnGo_Click (Object sender, EventArgs e) 
{ 
    Response.Clear(); 

    string fileName= String.Format("data-{0}.csv", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "filename=" + fileName); 

    // write string data to Response.OutputStream here 
    Response.Write("aaa,bbb,ccc\n"); 

    Response.End(); 
} 

cite: RFC 4180

+0

Je suppose que vous avez l'intention que cela soit placé dans une page ASPX normale? Cela fonctionnerait, bien sûr, mais n'est pas vraiment optimal. Il y aura une surcharge pour initialiser/commencer à générer la page ASPX au démarrage. – Noldorin

+0

oui, cela irait dans une page ASPX "normale". Je ne sais pas ce que vous entendez par «overhead», ou pourquoi ce que j'ai ici n'est pas optimal. – Cheeso

+0

Oui, un ASHX devrait bien faire son travail. J'ai suggéré un gestionnaire HTTP personnalisé, mais soit fonctionnerait bien ici. – Noldorin

1

Vous pouvez écrire direcly au Response.OutputStream et définir le type de contenu à droite, et en-tête de disposition de contenu.

0

Oh, c'est pas mal. Dans votre Page_Load de la page ASPX faire:

Response.ContentType = "text/xml"; 
Response.ContentEncoding = System.Text.Encoding.UTF8; 
Response.Write(/* your text goes here */); 

Ce qui précède est un exemple si votre « dossier » est xml, mais il peut être quelque chose, et à partir de fichier Excel au format PDF. Tout ce que vous avez à faire est de mettre à jour le ContentType que vous pouvez rechercher via Google ou Live.

+0

wow vous les gens sont rapides ... =) – JasonRShaver

0

Essayez cet exemple:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "attachment; filename=download.csv"); 
    Response.Write("your,csv,file,contents"); 
    Response.End(); 
} 
4

Vous voulez regarder écrire un HTTP personnalisé gestionnaire (une classe qui implémente IHttpHandler) et simplement l'enregistrer dans web.config. Voir this article on MSDN pour un bon exemple de la façon d'en créer un.

Voici un exemple de base de la façon dont vous pourriez procéder à l'implémentation de l'un pour renvoyer le balisage de certaines données CSV.

using System.Web; 

public class MyCsvDocumentHandler : IHttpHandler 
{ 
    public static string Data 
    { 
     get; 
     set; 
    } 

    public MyCsvDocumentHandler() 
    { 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/csv"; // Set the MIME type. 
     context.Response.Write(Data); // Write the CSV data to the respone stream. 
    } 

    public bool IsReusable 
    { 
     // To enable pooling, return true here. 
     // This keeps the handler in memory. 
     get { return false; } 
    } 
} 

Cette alternative, qui est peut-être un peu plus simple, est d'utiliser une page ASHX handler. Le code serait presque identique.

+0

Notez qu'il est également possible (si sous-documenté) de lier un IHTTPHandler sans mélanger votre web.config - le type 'page' ASHX fournit le câblage pour vous. –

+1

(J'ai utilisé cette technique pour générer dynamiquement des boutons graphiques dans le passé, je pense que c'est très utile). –

+0

@Tetsujin: Oui, absolument. Dans certains cas, un gestionnaire HTTP (IHttpHandler) est plus souhaitable, car il offre un peu plus de flexibilité, mais un ASHX serait tout aussi bien dans ce cas. – Noldorin