2012-12-05 34 views
7

Tôi đang sử dụng GWT (Bộ công cụ Web của Google) để tạo trang web. Tôi cần hiển thị bảng cho người dùng và cho phép người dùng tải xuống nội dung của bảng.Làm cách nào để người dùng tải xuống tệp ở phía máy khách (Google Web Toolkit)

Về phía khách hàng, làm cách nào người dùng có thể tải xuống tệp khi họ nhấn nút "tải xuống"?

Nút "Tải xuống" có trình nghe onClick(). Và lớp phía máy khách mở rộng Composite.

Tôi đã cố gắng để mở rộng lớp học HttpServlet, nhưng nó trở nên quá phức tạp.

Tôi đã đọc bài viết ở đây:

  1. http://www.mkyong.com/java/how-to-download-file-from-website-java-jsp/
  2. How to use GWT when downloading Files with a Servlet?

Nhưng tôi vẫn không biết làm thế nào tôi có thể cung cấp tập tin tải về cho người sử dụng trên các mặt hàng.

+0

Đối với khách hàng: 'Window.Location.replace ("/downloadServlet ");' – Chloe

Trả lời

21

Bạn thực sự cần phân biệt giữa mã java phía máy khách GWT và mã Java phía máy chủ.

Về phía khách hàng trong Mã GWT Java của bạn

String url = GWT.getModuleBaseURL() + "downloadService?fileInfo1=" + fileInfo1; 
Window.open(url, "_blank", "status=0,toolbar=0,menubar=0,location=0"); 

Về phía máy chủ trong phi gwt Java của bạn số-

Trong web.xml

<servlet> 
    <servlet-name>downloadService</servlet-name> 
    <servlet-class>AAA.BBB.CCC.DownloadServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>downloadService</servlet-name> 
    <url-pattern>/<gwtmodulename>/downloadService</url-pattern> 
</servlet-mapping> 

Trong mã gói máy chủ, servlet

public class DownloadServlet extends HttpServlet{ 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
     { 
      String fileName = req.getParameter("fileInfo1"); 

      int BUFFER = 1024 * 100; 
      resp.setContentType("application/octet-stream"); 
      resp.setHeader("Content-Disposition:", "attachment;filename=" + "\"" + fileName + "\""); 
      ServletOutputStream outputStream = resp.getOutputStream(); 
      resp.setContentLength(Long.valueOf(getfile(fileName).length()).intValue()); 
      resp.setBufferSize(BUFFER); 
      //Your IO code goes here to create a file and set to outputStream// 

     } 
    } 

Đảm bảo bạn đẩy nội dung tệp của mình đến **outputStream**.

+0

Có bạn đã đúng. Tôi đã cố gắng để làm mã của riêng tôi, nhưng viết tập tin trên phía khách hàng là không thể. Tôi giải quyết vấn đề này tương tự như vậy. Dù sao, Cảm ơn bạn đã trả lời. –

+0

Thay vì tạo một servlet mới, bạn có thể sử dụng lại một trong các servlet dịch vụ GWT của bạn chỉ ghi đè phương thức 'javax.servlet.http.HttpServlet # doGet' –

+0

Không chắc chắn lắm. Bạn có thể chia sẻ một mẫu mã không. – SSR

3

Nếu bạn biết đường dẫn của tệp, Đoạn mã được hiển thị bên dưới.

button.addClickHandler(new ClickHandler() 
{ 

    @Overrid 
    public void onClick(ClickEvent event) 
    { 
     Window.open(GWT.getHostPageBaseURL() + "/file.rar", "name", "enabled"); 
    } 
}); 
+0

Cảm ơn nhận xét của bạn nhưng tôi đã cân nhắc điều này.Vấn đề là tôi không thể sử dụng tập tin văn bản thường xuyên ở phía máy khách (Nó có thể được biên dịch, nhưng gây ra lỗi - lỗi tải mô-đun) –

+0

Bạn không thể ghi tệp trên phía máy khách bằng mã, những thứ như thế này không được phép trên trình duyệt. Bạn cần phải để cho trình duyệt tải xuống tệp và người dùng chỉ định vị trí tải xuống. – Spiff

+0

Bạn nói đúng. Tôi giải quyết vấn đề này tương tự như cách này. Dù sao, Cảm ơn bạn đã trả lời. –

0

Để hoàn thành câu trả lời của số một mục trong phần io ...

bạn có thể tham khảo liên kết này

http://www.programcreek.com/2009/02/java-convert-a-file-to-byte-array-then-convert-byte-array-to-a-file/

hoặc tham khảo mã này

File file = new File(enter the filepath here) 
FileInputStream fis = new FileInputStream(file); 
       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       byte[] buf = new byte[1024]; 
       try { 
        for (int readNum; (readNum = fis.read(buf)) != -1;) { 
         bos.write(buf, 0, readNum); //no doubt here is 0 
         //Writes len bytes from the specified byte array starting at offset off to this byte array output stream. 
         System.out.println("read " + readNum + " bytes,"); 
        } 
       } catch (IOException ex) { 
        System.err.println("unable to convert to bytes"); 
       } 
       byte[] bytes = bos.toByteArray(); 
       outputStream.write(bytes); 
       outputStream.flush(); 
       outputStream.close(); 

hy vọng điều đó sẽ hữu ích!

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