Tôi có trang GWT nơi người dùng nhập dữ liệu (ngày bắt đầu, ngày kết thúc, v.v.), sau đó dữ liệu này sẽ chuyển đến máy chủ qua cuộc gọi RPC. Trên máy chủ tôi muốn tạo báo cáo Excel với POI và cho phép người dùng lưu tệp đó trên máy cục bộ của họ.Tải xuống tệp động với GWT
Đây là mã thử nghiệm của tôi để truyền tập tin lại cho khách hàng nhưng đối với một số lý do tôi nghĩ rằng nó không biết làm thế nào để dòng tập tin cho khách hàng khi tôi đang sử dụng RPC:
public class ReportsServiceImpl extends RemoteServiceServlet implements ReportsService {
public String myMethod(String s) {
File f = new File("/excelTestFile.xls");
String filename = f.getName();
int length = 0;
try {
HttpServletResponse resp = getThreadLocalResponse();
ServletOutputStream op = resp.getOutputStream();
ServletContext context = getServletConfig().getServletContext();
resp.setContentType("application/octet-stream");
resp.setContentLength((int) f.length());
resp.setHeader("Content-Disposition", "attachment; filename*=\"utf-8''" + filename + "");
byte[] bbuf = new byte[1024];
DataInputStream in = new DataInputStream(new FileInputStream(f));
while ((in != null) && ((length = in.read(bbuf)) != -1)) {
op.write(bbuf, 0, length);
}
in.close();
op.flush();
op.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
return "Server says: " + filename;
}
}
Tôi đã đọc một nơi nào đó trên internet mà bạn không thể làm dòng tập tin với RPC và tôi phải sử dụng Servlet cho điều đó. Có ví dụ nào về cách sử dụng Servlet và cách gọi servlet đó từ ReportsServiceImpl. Tôi có thực sự cần phải thực hiện một servlet hoặc nó có thể dòng nó trở lại với RPC của tôi?
Xin hãy giải thích vấn đề một cách chi tiết hơn. "nó không biết" là không thực sự mô tả. Chính xác thì điều gì xảy ra? Điều gì xảy ra chính xác không? – BalusC
Câu trả lời của @sri có ý nghĩa. Bây giờ đến lượt của tôi để đăng một số ý kiến: 1) 'DataInputStream' là superflous. Chỉ cần sử dụng thẳng 'FileInputStream'. Bạn sau khi tất cả * chỉ * cần phương thức 'read()' được xác định trong lớp 'InputStream'. 2) Kiểm tra 'in! = Null' cũng rất đáng kể vì đó là ** không bao giờ ** null (bạn đã tạo mới bằng cách sử dụng' new', không bao giờ có thể rỗng). 3) Đầu đề 'Content-Disposition' trông không đúng định dạng trong phần' filename'. Để có được một số ý tưởng về cách thực hiện tệp * basic *, bạn có thể thấy [this article] (http://balusc.blogspot.com/2007/07/fileservlet.html) hữu ích. Chúc may mắn. – BalusC