2010-01-23 6 views
8

Je souhaite effectuer un téléchargement de fichier en utilisant java, struts2 et ajax.Téléchargement de fichier en utilisant Java, Struts 2 et AJAX

Sur ma page html il y a un bouton appelé "export" en cliquant sur l'appel ajax qui va exécuter une requête et va créer un fichier .xls en utilisant le code et je veux donner ce fichier à télécharger à l'utilisateur sans le stocker sur le disque dur.

Est-ce que quelqu'un sait comment faire cela en utilisant struts2 et ajax en java?

Existe-t-il un exemple disponible?

Laissez-moi savoir si vous avez besoin de plus de détails de moi ...

Merci.

amar4kintu

Répondre

11

Vous ne devez pas utiliser AJAX dans ce cas. Ayez juste votre bouton soumettre le formulaire à votre action Struts, et que l'action utilise le type stream result.

Exemple:

Dans votre XML Struts:

<result name="download" type="stream"> 
    <param name="contentDisposition">attachment;filename=report.xls</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="inputName">inputStream</param> 
    <param name="bufferSize">1024</param> 
</result> 

Votre action sera ensuite fournir un public InputStream getInputStream() pour transmettre les données.

Je présume que quelle que soit la bibliothèque que vous utilisez pour générer les fichiers Excel (POI?) Peut écrire la sortie à un OutputStream arbitraire.

Un moyen rapide et sale pour le convertir en un InputStream:

// Using Workbook from Apache POI for example... 
Workbook wb; 
// ... 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
wb.write(bos); 
InputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
+0

Bonjour, Je mis follwing dans mon struts.xml \t \t \t \t \t CONTENTTYPE application/vnd.ms Excel \t \t \t \t \t \t fileStream \t \t \t \t \t \t pièce jointe; filename = report.xls \t \t \t \t \t \t 1024 \t \t Maintenant, j'ai suivi vos instructions, mais il donne le fichier à télécharger avec le nom de l'action qui est ExportReport.action au lieu de report.xls Alors, quelle devrait être la raison? – amar4kintu

+0

Donc, vous utilisiez MSIE? Soit vous passez le nom du fichier comme URL pathinfo, soit vous utilisez un meilleur navigateur web. – BalusC

+0

J'utilise firefox et il devrait me donner le fichier de téléchargement comme report.xls mais à la place il me donne ExportReport.action à télécharger. et Si je le renommer en report.xls. Il montre le fichier .xls parfait que j'exporte .. Quelqu'un peut-il dire ce qui me manque? – amar4kintu

0

atlast, j'ai pu le résoudre de la manière suivante .. j'ai écrit la ligne suivante dans ma fonction de la classe d'action et j'étais en mesure de télécharger le fichier avec le nom report.xls au lieu de ExportReport.action. Je ne sais pas exactement .. pourquoi?

response.setHeader("Content-Disposition","attachment;filename=rpt.xls"); 

La suite est dans mon fichier struts.xml. J'ai enlevé <contentDispositin> param de lui parce qu'il ne fonctionnait pas du dossier struts.xml et je l'ai mis dans mon action Java comme ci-dessus.

<result name="success" type="stream" > 
    <param name="inputName">fileStream</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="bufferSize">1024</param> 
</result> 

Espérons que cela aidera quelqu'un.

Merci.

amar4kintu

0

j'utiliser ce genre d'annotation sur la classe d'action:

@Result(name = "success", type= StreamResult.class, 
      params = {"contentType", "application/vnd.ms-excel", 
        "contentDisposition", "attachment; filename=report.xls"}, 
      value = "reportFileStream" 
) 
2

En tant que suivi de la question de amar4kintu concernant les fichiers enregistrés en tant que ExportReport.action au lieu de report.xls, Cela se produit dans IE si le format suivant n'est pas suivi dans vos entretoises.fichier xml:

<result name="download" type="stream"> 
     <param name="contentDisposition">attachment;filename="${flashcardSetBean.title}.xlsx"</param> 
     <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param> 
     <param name="inputName">inputStream</param> 
     <param name="bufferSize">1024</param> 
</result> 

Il semble que la ligne contentDisposition en particulier doit indiquer que le fichier est une pièce jointe et que le nom de fichier est entouré par des guillemets.

2

Pour votre référence, nous pouvons faire la même chose en utilisant Annotation:

public class MyAction { 
    private InputStream fileInputStream; 
    private String logoName; 

    @Action(value="/downloadLogo", 
     results={ 
      @Result(name="success", type="stream", 
      params = { 
        "contentType", "application/image/gif", 
        "inputName", "fileInputStream", 
        "contentDisposition", "filename=\"${logoName}\"", 
        "bufferSize", "1024" 
      }) 
     }   
    )  
    public String downloadLogo() throws Exception { 
     logoName = "test.jpg"; 
      fileInputStream = new FileInputStream(new File("DirePath", logoName)); 
    } 
} 
0

Une meilleure approche de conduite outstream à un flux entrant est expliqué ci-dessous as opposed to the response by ZoogieZork above

InputStream is = new PipedInputStream(); 
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is); 
wb.write(out); 

L'avantage de cette méthode est que le tampon entier n'est pas stocké en mémoire mais est plutôt canalisé en utilisant un petit tampon circulaire interne. C'est mieux à la fois en termes de mémoire ainsi que les frais généraux du processeur.

Référence: Convert a Java OutputStream to an InputStream