Inviter l’utilisateur à enregistrer / ouvrir le fichier dans ASP.NET C #

Il ne devrait pas être si difficile de savoir comment faire cela. En gros, j’essaie de prendre une chaîne et de laisser le client l’enregistrer quand il clique sur un bouton. Il devrait apparaître avec une boîte de dialog Enregistrer / Ouvrir. Pas de cloches et de sifflets supplémentaires ou quoi que ce soit. Ce n’est pas sorcier (ou du moins je l’aurais pensé).

Il semble y avoir une tonne de façons différentes (StreamWriter, HttpResponse, etc.), mais aucun des exemples que j’ai pu trouver ne fonctionne correctement ou n’explique ce qui se passe. Merci d’avance.

Un exemple parmi les nombreux blocs de code que j’ai trouvés …

(Ceci est juste un exemple, n’hésitez pas à ne pas baser votre réponse sur cela.)

Ssortingng FileName = "FileName.txt"; Ssortingng FilePath = "C:/...."; //Replace this System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; response.ClearContent(); response.Clear(); response.ContentType = "text/plain"; response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); response.TransmitFile(FilePath); response.Flush(); response.End(); 

La ligne 2 dit de remplacer cette chaîne. Comment? Ce code a été annoncé comme une boîte de dialog. Je ne devrais pas avoir à définir un chemin dans le code, non?

EDIT: Final Outcome (à nouveau modifié, Delete doit précéder End ();)

  ssortingng FilePath = Server.MapPath("~/Temp/"); ssortingng FileName = "test.txt"; // Creates the file on server File.WriteAllText(FilePath + FileName, "hello"); // Prompts user to save file System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; response.ClearContent(); response.Clear(); response.ContentType = "text/plain"; response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); response.TransmitFile(FilePath + FileName); response.Flush(); // Deletes the file on server File.Delete(FilePath + FileName); response.End(); 

La ligne 2 (FilePath) indique le chemin du fichier sur le serveur.

Ligne 8:

 response.TransmitFile(FilePath); 

Transmet ce fichier spécifique au client et c’est ce qui ouvre la boîte de dialog de sauvegarde.

Si vous ne transmettez pas le fichier, je ne suis pas sûr que la boîte de dialog s’ouvre (même si vous avez défini un en-tête)

En tout cas, je pense que la ligne 8 devrait se lire:

  response.TransmitFile(FilePath + FileName); 

Il y aura une boîte de dialog par défaut par navigateur, s’il trouvera Response sous forme de fichier. Si vous souhaitez que le navigateur affiche cette boîte de dialog par défaut, il vous suffit d’envoyer la réponse au navigateur sous forme de fichier, ce que vous pouvez effectuer de différentes manières:

  1. Si c’est un fichier statique,

    • Le meilleur moyen est de simplement mentionner le chemin du fichier dans le préfixe de la balise d’ancrage (évidemment si vous n’avez pas de problème de sécurité).
    • Juste avec votre réponse, la façon dont cela est fait dans votre exemple.
    • Vous pouvez également vous référer ici à 4 méthodes différentes pour envoyer un fichier PDF à partir de asp.net
  2. S’il s’agit d’un fichier dynamic que vous devez générer au moment de l’exécution, vous pouvez effectuer une astuce, générer le fichier à partir de filestream, le placer dans un dossier temporaire du serveur et le relire sous la forme d’un fichier statique, comme indiqué ci-dessus.

FilePath est censé pointer vers le fichier que vous souhaitez envoyer au client. C’est le chemin sur le serveur .

Utilisez simplement ce code, il devrait inciter l’utilisateur à ouvrir une boîte de dialog pour ouvrir ou enregistrer le fichier sur le système ….

 byte[] bytesPDF = System.IO.File.ReadAllBytes(@"C:\sample.pdf"); if (bytesPDF != null) { Response.AddHeader("content-disposition", "attachment;filename= DownloadSample.pdf"); Response.ContentType = "application/octectstream"; Response.BinaryWrite(bytesPDF); Response.End(); }