2009-08-20 8 views
4

Je pense que c'est assez simple. Mon programme va créer un fichier Excel sur le serveur en utilisant Automation. Après cela, je veux forcer l'utilisateur à choisir de le télécharger ou non, puis, quel que soit le choix, supprimer le fichier pour qu'il ne prenne pas seulement de la place. Des idées sur la façon dont je pourrais accomplir cela?Supprimer un fichier après l'invite de téléchargement de l'utilisateur

Répondre

8

Vous pouvez lire le fichier dans un tampon d'entrée, puis supprimer le fichier et envoyer le tampon à l'utilisateur au lieu du fichier réel.

+0

can u pls poster exemple de code ..? – shashwat

1

Il est difficile de savoir quand l'utilisateur a fini de télécharger le fichier, et vous ne voulez pas le supprimer avant de le faire, par conséquent mon conseil est de supprimer les fichiers plus d'un certain temps, par exemple> 24 heures. Il est difficile de déterminer si l'utilisateur a fini de télécharger le fichier parce que le navigateur ne transmet pas cette information, et autre que le paquet reniflant les données du réseau et configurant en détail votre serveur Web pour gérer ses connexions ouvertes, et en croyant réellement ne fera pas d'erreurs, il n'y a pas de moyen simple. Cela dépend également de la façon dont vous lisez le fichier et de sa taille réelle. Par exemple, aller ligne par ligne pour envoyer au navigateur économisera de la mémoire, mais cela rendra le code dépendant de l'existence du fichier, tout en lisant le fichier. Le contenu du fichier à une sorte de tampon permettra au serveur web de bien le servir, mais en fonction du nombre de visiteurs, de la taille du fichier et de la vitesse moyenne de téléchargement, vous pouvez avoir un serveur web avec des dizaines de fichiers en mémoire.

Il est simplement plus facile d'avoir assez d'espace pour quelques jours de données et de supprimer des fichiers de temps en temps.

+0

Disons que je n'ai pas accès au serveur sur lequel cela sera exécuté. Comment est-ce que j'écrirais le code pour supprimer des dossiers plus vieux que 24 heures, et comment le programmerais-je pour fonctionner? Toutes les idées seraient utiles, puisque je préférerais aller dans cette voie. –

1

Une façon très agréable, est dans votre global.asax

Je pense que quelque chose de similaire utilise des, bien que je ne me souviens de ce que ... (je suis sûr volé ce code hors les)

private static CacheItemRemovedCallback OnCacheRemove = null; 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 

    // delete old spreadsheets every hour 
    AddTask("DeleteDayOldSpreadsheets", 3600); 

} 

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // do stuff here 
    switch (k) 
    { 
     case "DeleteDayOldSpreadsheets": 
      // TODO: add your magic DELETE OLD SPREADSHEET code here 
      break;  

     default: 
      break; 
    } 

    // re-add our task so it recurs 
    AddTask(k, Convert.ToInt32(v)); 
} 
-1

Comme indiqué dans Microsoft KB 257757, Microsoft recommande contre l'utilisation de l'automatisation sur un serveur:

" Microsoft ne recommande pas et ne prend pas en charge, l'automatisation des applications Microsoft Office de tout sans surveillance, l'application client non interactif ou un composant (y compris les services ASP, ASP.NET, DCOM et NT), car Office peut présenter un comportement instable et/ou un blocage lorsque Office est exécuté dans cet environnement.

et d'autres bibliothèques tierces peuvent le faire et elles seront plus rapides et plus fiables SpreadsheetGear prend en charge l'écriture directe dans le flux de sortie afin que vous n'ayez pas besoin de créer un fichier temporaire sur disque - donnant de meilleures performances et ne vous inquiétez pas de nettoyer les fichiers sur la gauche.

vous pouvez voir des exemples ASP.NET Excel avec la source d'information C# et VB here et télécharger un essai gratuit here si vous voulez l'essayer pour vous-même.

Désistement: Je possède SpreadsheetGear LLC

0

Je sais que la question a demandé un certain temps, mais je pense que ce conseil serait utile.

Voici le code C# qui fait l'affaire.

Pour plus d'infomarion j'ai indiqué le lien de référence où j'ai trouvé l'idée originale de. C'était utile pour moi.

REFERENCE LINK

private void DownloadFile() 
{ 
    Response.ContentType = ContentType; 
    Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.txt"); 
    Response.WriteFile(Server.MapPath("~/uploads/myFile.txt")); 
    Response.Flush(); 
    // Delete the file just before execute Response.End() 
    System.IO.File.Delete(Server.MapPath("~/uploads/myFile.txt")); 
    Response.End(); 
} 
Questions connexes