2010-12-12 31 views
5

Các bạn, tôi không thể tìm thấy thông tin này rõ ràng trên web. Tôi có một hành động và tôi đang tạo ra một tập tin văn bản, tuy nhiên luôn luôn xuất hiện cho khách hàng như là một tập tin "generatePDF.action". Tôi muốn nó hiển thị như một tập tin receipt.txt.Làm thế nào tôi có thể xác định tên đầu ra của một StreamResult trong Struts2?

Đây là chú thích của tôi:

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

Điều này có xảy ra nhất quán trên các trình duyệt hoặc là hành vi được tách biệt với một trình duyệt/phiên bản cụ thể không? –

+0

Thật không may, nó vui vẻ trên Firefox 3.6 và Chrome 8 –

Trả lời

5

Nếu bạn đang sử dụng các công ước plug-in sau đó cho phép sử dụng đoạn mã sau để chạy chiếu dưới "/ YourApplicationContext/suối/stream-test" mà sau đó quyết tâm " /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; 
    } 
} 

Xin lưu ý của 'contentDisposition' và rằng giá trị của nó đã được thiết lập để 'filename =' Document.txt' thay đổi 'Document.txt' giúp bạn những gì bạn muốn.

+0

Lưu ý Struts2 không cần get/set Tôi cảm thấy rằng nó làm cho nguồn không cần thiết lâu hơn để trình diễn. – Quaternion

+0

Cũng lưu ý rằng nếu bạn bỏ qua contentDisposition để đặt tên tệp thì tên tệp sẽ trở thành tên của hành động được nối với loại nội dung (trong trường hợp contentType = "text/html" và một hành động có tên là 'document' bạn sẽ nhận được document.html, contentType = "text" rồi document.txt) – Quaternion

+0

Cảm ơn câu trả lời, nhưng tôi vẫn còn một vấn đề nhỏ. Tệp đang được hiển thị trên trình duyệt (được thử nghiệm trên chrome và firefox). Tôi muốn hiển thị cửa sổ donwload. –

0

Các chú thích ban đầu là tốt, nó chỉ chứa một typo:

"contentDispostion" nên đọc "contentDisposition"

tôi đưa tôi lứa tuổi để con số này ra, vì vậy tôi nghĩ rằng tôi muốn làm cho nó rõ ràng :-)

0

chú thích của tôi về cơ bản là giống nhau, nhưng tôi đã sử dụng một tài liệu tham khảo để thiết lập tên file của:

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

exportFilename là một biến string với ge tter và setter và nó cũng có thể được đặt ở một lớp kế thừa, vì vậy có thể tạo một ExportAction duy nhất và làm cho tất cả các hành động mở rộng nó.

Có thể bạn có thể tạo biến để đặt tất cả các giá trị của thông số.

Các vấn đề liên quan