2012-02-03 4 views
0

Je suis en train de télécharger plusieurs fichiers PDF en pièces jointes dans mon application asp.net. J'ai créé des modèles et des valeurs de remplissage en utilisant pdfstamper (itextsharp). Je suis capable de remplir les valeurs mais je ne peux pas télécharger.télécharger plusieurs pdf

private void FillForm(string path, DataTable BridgeValues, DataTable Comments, DataTable Maintenance,string Newfilename) 
    { 
     try 
     { 
      string pdfTemplate = path; 
      string newFile = Newfilename; 
      string Pathser = ""; 
      if (!System.IO.Directory.Exists(Server.MapPath(@"~/PDF/"))) 
      { 
       System.IO.Directory.CreateDirectory(Server.MapPath(@"~/PDF/")); 
      } 

      if (Directory.Exists(Server.MapPath(@"~/PDF/"))) 
      { 
       Pathser = Server.MapPath(@"~/PDF/" + Newfilename); 
      } 
      System.IO.MemoryStream mStream = new System.IO.MemoryStream(); 
      // create a new PDF reader based on the PDF template document 
      PdfReader pdfReader = new PdfReader(pdfTemplate); 
      PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(Pathser, FileMode.Create)); 
      AcroFields pdfFormFields = pdfStamper.AcroFields; 
      DataColumn dc = null; 
      for (int i = 0; i < BridgeValues.Columns.Count - 1; i++) 
      { 
       dc = BridgeValues.Columns[i]; 
       pdfFormFields.SetField(dc.ColumnName.ToString(), BridgeValues.Rows[0][dc].ToString()); 
      } 
      pdfStamper.FormFlattening = true; 

      // close the pdf 
      pdfStamper.Close(); 
      ////Response.ContentType = "application/octet-stream"; 
      Response.ContentType = "application/pdf"; 
      ////Response.AddHeader("Content-Disposition", "attachment; filename=Report.pdf"); 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + Newfilename + ""); 
      ////Response.BinaryWrite(mStream.ToArray()); 
      Response.TransmitFile(Server.MapPath(("~/PDF/"+ Newfilename))); 
      Response.Clear(); 
      Response.End(); 
     } 
     catch (System.Threading.ThreadAbortException lException) 
     { 

      // do nothing 

     } 
    } 

Première fois que j'ai essayé de créer un pdf, cela a fonctionné mais plus tard, quand j'ai essayé de télécharger plusieurs fichiers, cela a donné une exécution. Impossible d'évaluer l'expression car le code est optimisé ou une image native est au-dessus de la pile d'appels.

+1

Pourquoi vous attrapez ThreadAbortException? Il sera automatiquement réécrit, mais vous ne devriez pas l'attraper ... Quant à l'exception - que * n'inclurait pas la partie "Impossible d'évaluer l'expression ..." - c'est exactement ce que montre le débogueur, ça ne fait pas partie de l'exception. –

+0

qui était l'essai final que j'ai fait, il y avait une certaine exécution "Impossible d'évaluer l'expression parce que le code est optimisé ou un cadre natif est au-dessus de la pile d'appels." J'ai donc essayé la partie catch. –

+0

Non, ce n'est pas * l'exception. Ce n'est vraiment, vraiment pas. C'est juste ce qui se passe dans le débogueur. Si vous regardez dans l'exception pour le message, ce ne sera pas le cas. –

Répondre

1

Je ne pense pas que vous pouvez télécharger plusieurs fichiers en faisant une demande et en retournant une collection de l'action. Je suggère que vous devez permettre à l'utilisateur de télécharger plusieurs fichiers que vous les ZIP et diffuser l'archive vers le navigateur.

Voici un exemple de passer comme un éclair plusieurs fichiers: http://devpinoy.org/blogs/keithrull/archive/2008/01/25/how-to-create-zip-files-in-c-with-sharpziplib-ziplib.aspx

+0

Je passais en revue le nombre de fichiers et de les télécharger, mais c'est une mauvaise idée. Comme vous le disiez, je les téléchargerais sous forme de zip.can j'épargnerais beaucoup de fichiers sur le serveur et les téléchargerais comme un zip? –