2012-01-09 2 views
1

J'ai un contrôleur avec deux pages, Index et téléchargement, en cliquant sur télécharger, il récupère un byte [] du service et j'utilise Response.BinaryWrite pour enregistrer le fichier. Le problème avec ceci est que lors de l'utilisation de Response.Clear, il arrête la page de téléchargement du rendu mais télécharge le fichier avec succès. Est-il possible de télécharger le fichier et de rendre la page?Comment: Enregistrer un fichier à partir d'un service Web sans arrêter la page de rendu

J'utilise .NET 4, ASP, Château Monorail, C#

Je suis conscient qu'en utilisant MVC, je suis en mesure d'utiliser ActionResult et FileResult comme types de retour pour mon point de vue, je suis cependant limité à l'utilisation Monorail Castle est un projet existant dont j'ai récemment pris possession et qui n'a aucun poids pour changer sa technologie.

Ci-dessous mon exemple de code

public class MyController : Controller 
{ 
    public void Index() 
    { 
     PropertyBag["includeZeroBalances"] = false; 
     PropertyBag["toDate"] = DateTime.Today.ToShortDateString(); 
    } 

    public void Download(bool includeZeroBalances, DateTime toDate) 
    { 
     MyProxy proxy = GetProxy(); 
     byte[] file = proxy.GetFile(includeZeroBalance, toDate); 
     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename="TestFileName.zip"); 
     Response.BinaryWrite(file); 
    } 
} 

Voici la page d'index

${Form.FormTag({@action: 'Download'})} 
    <table> 
     <tr> 
      <td>${Form.LabelFor("toDate", "To Date (yyyy/mm/dd):")}</td> 
      <td><input type="text" id="toDate" name="toDate" value="${?toDate}" /></td> 
     </tr> 
     <tr> 
      <td>${Form.LabelFor("includeZeroBalances", "Include Zero Balances:")}</td> 
      <td>${Form.CheckboxField("includeZeroBalances")}</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>${Form.Submit("Download", {@class: 'submitb'})}</td> 
     </tr> 
    </table> 
${Form.EndFormTag()} 

Voici la page de téléchargement

<table> 
    <tr> 
     <td>Your file has been downloaded successfully</td> 
    </tr> 
</table> 

Répondre

1

La réponse que je suis venu avec est pas aussi générique que je l'aurais aimé, mais cette solution est fonctionnelle.

public class MyController : Controller 
{ 
    public void Index() 
    { 
     PropertyBag["includeZeroBalances"] = false; 
     PropertyBag["toDate"] = DateTime.Today.ToShortDateString(); 
    } 

    public void Download(bool includeZeroBalances, DateTime toDate) 
    { 
     MyProxy proxy = GetProxy(); 
     byte[] file = proxy.GetFile(includeZeroBalance, toDate); 
     PropertyBag["downloadurl"] = "data:application/zip;base64," + System.Convert.ToBase64String(file); 
    } 
} 

Voici la page d'index

${Form.FormTag({@action: 'Download'})} 
    <table> 
     <tr> 
      <td>${Form.LabelFor("toDate", "To Date (yyyy/mm/dd):")}</td> 
      <td><input type="text" id="toDate" name="toDate" value="${?toDate}" /></td> 
     </tr> 
     <tr> 
      <td>${Form.LabelFor("includeZeroBalances", "Include Zero Balances:")}</td> 
      <td>${Form.CheckboxField("includeZeroBalances")}</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>${Form.Submit("Download", {@class: 'submitb'})}</td> 
     </tr> 
    </table> 
${Form.EndFormTag()} 

Voici la page de téléchargement

<table> 
    <tr> 
     <td>Your file has been generated successfully. <a href="${downloadurl}">Click here</a> to download your file</td> 
    </tr> 
</table> 

Vous pouvez également ajouter le javascript pour automatiser le téléchargement du fichier dans une nouvelle fenêtre.

document.Ready(function() 
{ 
    window.open("${downloadurl}"); 
}); 

Avantages de l'utilisation de cette méthode pour enregistrer les fichiers: Aucun Les fichiers sont enregistrés sur le serveur. Frais généraux légèrement plus bas lors du téléchargement de fichiers sur environ 300 ko Vous n'écrasez pas les données de réponse, donc la vue sera rendue comme d'habitude. Inconvénients de l'utilisation de cette méthodologie pour enregistrer des fichiers: Inconvénients de l'utilisation de cette méthode sur n'importe quel navigateur de n'importe quelle version. Si utilisé pour Static Files, quand le fichier change, l'uri devra être généré à nouveau puisque le contenu du fichier est incorporé dans l'uri

J'espère que ceci aide d'autres qui semblent avoir été bloqués sur le même problème.J'ai vu ce genre de question dans un certain nombre de conseils sans solution directe.

1

La façon de faire 'bon' ce serait en utilisant des réponses en plusieurs parties, malheureusement some browsers don't support them.

Ce que vous pouvez faire est d'utiliser un meta refresh comme sourceforge et d'autres sites. Pour des alternatives, voir ces questions:

+0

Salut Mauricio, merci pour les liens et les idées que vous nous avez fournis. Malheureusement, ce n'était pas tout à fait ce que je cherchais. –

+0

@ROFFELPOMP: Eh bien, c'est exactement ce que vous avez fait dans votre réponse. –

Questions connexes