2010-12-12 3 views
5

Faceci, nie mogę znaleźć tych informacji w sieci. Mam akcję i generuję plik tekstowy, jednak zawsze pojawia się on dla klienta jako plik "generatePDF.action". Chcę to pokazać jako plik receipt.txt.Jak zdefiniować nazwę wyjściową StreamResult w Struts2?

Oto moja adnotacja:

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

Czy dzieje się to konsekwentnie w różnych przeglądarkach lub czy zachowanie jest zależne od konkretnej przeglądarki/wersji? –

+0

Niestety, stało się to na Firefox 3.6 i Chrome 8 –

Odpowiedz

5

Jeśli używasz konwencje plug-in, następnie pozwala użyć następującego kodu do testów referencyjnych pod „/ YourApplicationContext/stream/strumieniem-test”, które następnie postanawia " /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; 
    } 
} 

Proszę wziąć pod uwagę«contentDisposition»i że jej wartość została ustawiona na«filename = «Document.txt»»zmienia«Document.txt»dostaje co chcesz.

+0

Uwaga Struts2 nie potrzebuje get/set Uważam, że sprawia, że ​​źródło jest niepotrzebnie dłuższe do demonstracji. – Quaternion

+0

Należy również pamiętać, że jeśli pominiesz opcję contentDisposition, aby ustawić nazwę pliku, nazwa pliku stanie się nazwą akcji dołączonej do typu zawartości (w przypadku contentType = "text/html" i akcji o nazwie "document") otrzymam document.html, contentType = "text", a następnie document.txt) – Quaternion

+0

Dziękuję za odpowiedź, ale wciąż mam jeden mały problem. Plik jest renderowany w przeglądarce (testowany na chrome i firefox). Chciałem wyświetlić okno donwload. –

0

Oryginalny adnotacja jest w porządku, że zawiera tylko literówkę:

„contentDispostion” należy czytać „contentDisposition”

I zajęło mi wieki, aby dowiedzieć się tego, więc pomyślałem, że jasno :-)

0

Moja adnotacja jest w zasadzie taka sama, ale użyłem odniesienie ustawić nazwę pliku na:

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

exportFilename jest zmienną String z ge tter i setter, a także można go umieścić w klasie dziedziczącej, dzięki czemu możliwe jest utworzenie unikalnej funkcji ExportAction i wykonanie wszystkich akcji.

Prawdopodobnie można tworzyć zmienne w celu ustawienia wszystkich wartości parametrów.