2012-05-04 44 views
5

Tôi không biết cách tải xuống tệp CSV. CSV sẽ được tạo khi chạy. Tôi có cần lưu tệp trong thư mục tomcat WEB-INF trước không? Tôi đang sử dụng JSF 1.2.Tải xuống tệp CSV bằng cách sử dụng JSF

Nhân tiện, thành phần JSF ưu tiên cho loại công việc này là gì?


Chỉnh sửa (05.05.2012 - 15:53)

Tôi đã thử các giải pháp được nêu trong BalusC đầu tiên của mình link, nhưng nếu tôi bấm vào CommandButton tôi nội dung của file sẽ được hiển thị trên trang web. Có thể có sự cố với số mimetype?

xhtml-file:

<a4j:form> 
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" /> 
</a4j:form> 

đậu chính:

public String doDataExport() { 

    try { 
     export.downloadFile(); 
    } catch (SurveyException e) { 
     hasErrors = true; 
    } 
    return ""; 
} 

xuất đậu:

public void downloadFile() throws SurveyException { 

    try { 

     String filename = "analysis.csv"; 

     FacesContext fc = FacesContext.getCurrentInstance(); 
     HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 

     response.reset(); 
     response.setContentType("text/comma-separated-values"); 
     response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

     OutputStream output = response.getOutputStream(); 

     // writing just sample data 
     List<String> strings = new ArrayList<String>(); 

     strings.add("filename" + ";" + "description" + "\n"); 
     strings.add(filename + ";" + "this is just a test" + "\n"); 

     for (String s : strings) { 
      output.write(s.getBytes()); 
     } 

     output.flush(); 
     output.close(); 

     fc.responseComplete(); 

    } catch (IOException e) { 
     throw new SurveyException("an error occurred"); 
    } 
} 

Chỉnh sửa (05.05.2012 - 16:27)

Tôi đã giải quyết được vấn đề của mình. Tôi phải sử dụng <h:commandButton> thay vì <a4j:commandButton> và giờ nó hoạt động!

Trả lời

4

Tôi có cần phải lưu các tập tin trong thư mục tomcat WEB-INF đầu tiên?

Không, chỉ cần viết nó thẳng cho cơ thể phản ứng HTTP như bạn có được bằng ExternalContext#getResponseOutputStream() sau khi đã thiết lập các tiêu đề phản ứng thích hợp mà báo cho browser biết nó sẽ lấy.

Làm toán dựa trên các ví dụ cụ thể được tìm thấy trong các câu trả lời sau đây:

Về cơ bản:

List<List<Object>> csv = createItSomehow(); 
writeCsv(csv, ';', ec.getResponseOutputStream()); 

Nhân tiện, thành phần jsf yêu thích cho loại nhiệm vụ này là gì?

Đây là chủ quan. Nhưng dù sao, chúng tôi đang sử dụng <p:dataExporter> để thỏa mãn đầy đủ.

+0

Tôi không nghĩ rằng mình có thể sử dụng 'PrimeFaces', vì chúng không hỗ trợ JSF 1.2 từ' PrimeFaces 2.0' khi tôi đúng? –

+1

Đúng vậy, phiên bản JSF 1.x cổ đại sắp kết thúc, vì vậy bạn không nên mong đợi hỗ trợ thư viện thành phần mới cho nó. Chỉ cần tiếp tục với phát trực tuyến thủ công. Bạn chỉ cần lấy 'HttpServletResponse' thô bằng' ExternalContext # getResponse() 'và sau đó gọi' getOutputStream() 'thay vào đó, nhưng nó đã được phác thảo trong liên kết thứ nhất. Hoặc, tất nhiên, nâng cấp lên JSF 2. Nó cung cấp rất nhiều lợi thế hơn JSF 1.2. – BalusC

+0

Tôi biết những bất lợi của jsf 1.2, nhưng tại thời điểm này chúng tôi không thể nâng cấp lên cấp cao hơn. Tôi đã cố gắng để hiểu liên kết đầu tiên của bạn, nhưng nó không hoạt động. Tôi đã sử dụng mimetype 'text/dấu phẩy-giá trị' tôi tìm thấy trên web, nhưng các trình duyệt (IE, FF, Chrome) không diễn giải chính xác. –

0

Nếu bạn đang sử dụng JSF 2, bạn có thể sử dụng các dấu phẩy.
Bạn có thể xem qua số link.

Nếu không bạn có thể làm điều đó như thế:

List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";  
File file = new File(filename); 
Writer output = new BufferedWriter(new FileWriter(file)); 
output.append("Column1"); 
output.append(","); 
output.append("Column2"); 
output.append("\n"); 
//your data goes here, Replcae Object with your bean 
for (Object row:report){ 
    output.append(row.field1); 
    output.append(","); 
    output.append(row.field2); 
    output.append("\n"); 
} 
output.flush(); 
output.close(); 
Các vấn đề liên quan