2009-06-03 9 views
1

J'essaie de faire à peu près la même chose, comme est par exemple sur sourceforge. Après qu'un utilisateur crée des données, je génère un fichier et je veux qu'il lui soit offert après le chargement d'une page. Cependant, je ne sais presque rien à propos de javascript et pâte de copie simple deCharger le fichier après la page est complète sans rediriger

< script type="text/javascript"> 
var download_url = "http://downloads.sourceforge.net/sourceforge/itextsharp/itextsharp-4.1.2-dll.zip?use_mirror=dfn"; 


function downloadURL() { 
    if (download_url.length != 0 && !jQuery.browser.msie){ 
     window.location.href = download_url; 
    } 
} 

jQuery(window).load(downloadURL); 

< /script> 

ne suffit pas. Il est important pour l'utilisateur de télécharger le fichier, alors comment faire?

Une question liée à la précédente est - où stocker le fichier que j'ai créé? Une fois en utilisant le serveur de développement asp.net puis sur le vrai serveur iis? Et comment cette adresse devrait-elle ressembler? Quand j'ai essayé

Je n'obtenais rien, avec http une erreur d'adresse inconnue.

Répondre

1

Voir l'exemple Haack's DownloadResult. Il explique (je pense) exactement ce que vous essayez de faire. Sauf que vous fournissez l'appel de délai avec votre URL d'action de téléchargement.

1

Vous demandez au navigateur de l'utilisateur de rechercher un fichier sur son propre ordinateur ... que vous essayez d'enregistrer ici.

vous pouvez utiliser quelque chose comme:

window.location.href='http://www.yourServer.com/generatePDF.asp?whatever=whatever' 

http://www.yourServer.com/generatePDF.asp?whatever=whatever est ce qui génère le fichier pdf pour l'utilisateur

1

Sur le serveur, vous devez définir la disposition de contenu dans l'en-tête de réponse " Pièce jointe "comme décrit dans these answers.

Si vous faites cela, le téléchargement n'affectera pas la page actuellement affichée dans le navigateur. Donc, si vous lancez une requête en Javascript qui obtient une pièce jointe, le navigateur laissera la page seule, et l'utilisateur verra une boîte de message avec la question Ouvrir/Enregistrer/Annuler.

0

Un couple de choses différentes. Tout d'abord, puisque vous utilisez MVC, créez une action qui génère réellement le fichier et le renvoie sous la forme FileResult. Le fichier peut être un fichier réel sur le serveur, mais il peut également être généré dynamiquement - disons dans un MemoryStream - et le FileResult créé à partir de cela. Définissez le contenu sur application/octet-stream ou le type de fichier réel s'il ne s'agit pas d'un rendu dans le navigateur via un plug-in. Deuxièmement, ne générez pas le fichier dans l'action qui affiche la page, mais appelez plutôt l'action qui génère le fichier FileResult à partir de cette page en utilisant la technique que vous avez référencée (bien qu'il semble qu'ils fassent quelque chose de différent pour IE). Si le type MIME n'est pas un type qui peut être rendu, il sera téléchargé.

public ActionResult GenerateFile(string value, int other) 
{ 

    MemoryStream file = new MemoryStream(); 
    ... 

    return File(file, "application/octet-stream"); 
} 
+0

Le problème est, j'utilise iText bibliothèque pour générer le pdf. Par conséquent, le fichier à créer est de type Document, ce qui n'est pas compatible avec FileResult. Mais s'il y a une autre façon de générer un pdf ..? – Trimack

1

Vous pouvez créer votre propre PdfResult qui s'étend ActionResult comme ceci:

public class PdfResult : ActionResult 
{ 
    public byte[] Content { get; set; } 
    public string FileName { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.AddHeader("content-disposition", "attachment; filename=" + this.FileName); 
     response.AddHeader("content-length", this.Content.Length.ToString()); 
     response.ContentType = "application/pdf"; 

     using (MemoryStream memoryStream = new MemoryStream(this.Content)) 
     { 
      memoryStream.WriteTo(response.OutputStream); 
     } 

     response.End(); 
    } 

Ensuite, dans votre action, vous pouvez simplement retourner le fichier comme suit:

public ActionResult Pdf(string param1...) 
    { 
     var content = GeneratePdf(); //etc 
     var fileName = AssignFileName(); 

     return new PdfResult { Content = content, FileName = fileName + ".pdf" }; 
    }