2010-12-12 3 views
5

Les gars, je ne peux pas trouver cette information clairement sur le web. J'ai une action et je génère un fichier texte, mais apparaît toujours au client comme un fichier "generatePDF.action". Je veux qu'il apparaisse comme un fichier receipt.txt.Comment puis-je définir le nom de sortie d'un StreamResult dans Struts2?

Voici mon annotation:

@Action(value = "/generateTXT", 
    results = { 
     @Result(name = "ok", type = "stream", 
     params = {"inputName", "inputStream", 
        "contentType", "application/octet-stream", 
        "contentDispostion", "attachment;filename=receipt.txt"}) 
    }) 
+0

Cela se produit-il de manière cohérente entre les navigateurs ou le comportement est-il isolé à un navigateur/une version spécifique? –

+0

Malheureusement, cela s'est passé sur Firefox 3.6 et Chrome 8 –

Répondre

5

Si vous utilisez les conventions plug-in permet ensuite d'utiliser le code suivant pour des courses de référence sous "/ YourApplicationContext/flux/flux-test" qui résout ensuite " /YourApplicationContext/stream/document.txt ":

package struts2.stream; 

import com.opensymphony.xwork2.ActionSupport; 
import java.io.InputStream; 
import java.io.StringBufferInputStream; 
import org.apache.struts2.convention.annotation.Result; 


@Result(name = ActionSupport.SUCCESS, type = "stream", params = 
{ 
    "contentType", 
    "text/hmtl", 
    "inputName", 
    "inputStream", 
    "contentDisposition", 
    "filename=document.txt" 
}) 
public class StreamTestAction extends ActionSupport{ 
    public InputStream inputStream; 

    @Override 
    public String execute(){ 
    inputStream = new StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");  
    return SUCCESS; 
    } 
} 

S'il vous plaît prendre note de « ContentDisposition » et que sa valeur a été réglée sur « filename = « document.txt » » changer « document.txt » vous obtient ce tu veux.

+0

Note Struts2 n'a pas besoin de get/set Je pense que cela rend la source inutilement plus longue pour la démonstration. – Quaternion

+0

Notez également que si vous omettez le paramètre ContentDisposition pour définir le nom de fichier, le nom de fichier devient le nom de l'action ajoutée au type de contenu (dans le cas de contentType = "text/html" et une action "document" obtiendrait document.html, contentType = "texte" puis document.txt) – Quaternion

+0

Merci pour la réponse, mais je suis toujours avec un petit problème. Le fichier est rendu sur le navigateur (testé sur chrome et firefox). Je voulais afficher la fenêtre de téléchargement. –

0

L'annotation originale est très bien, il ne contient qu'une faute de frappe:

« contentDispostion » devrait se lire « ContentDisposition »

Je me pris énormément de temps pour comprendre cela, donc je pensais que je ferais clairement :-)

0

Mon annotation est fondamentalement la même, mais j'utilisé une référence pour définir le nom du fichier:

@Result(name="export", type="stream", 
    params={ "contentType", "application/octet-stream", 
    "inputName", "fileInputStream", 
    "contentDisposition", "attachment;filename=%{exportFilename}", 
    "bufferSize", "4096"}) 

ExportFileName est une variable String avec ge tter et setter et il peut aussi être placé dans une classe héritable, il est donc possible de créer un ExportAction unique et de faire en sorte que toutes les actions l'étendent.

Vous pouvez probablement créer des variables pour définir les valeurs de tous les paramètres.

Questions connexes