2009-07-10 30 views
44

Tôi đang cố gắng tìm cách tải lên một tệp bằng cách sử dụng tiện ích Tải lên tệp GWT. Tôi đang sử dụng GWT và Google AppEngine với Java nhưng tôi muốn tải tệp lên máy chủ Linux của riêng mình. Tôi có đoạn code sau đây đã nhưng bây giờ tôi không thể tìm ra cách để nộp hồ sơ của tôi đến máy chủ Google AppServer và lưu nó vào máy chủ khác:Tải lên tệp cơ bản trong GWT

public class FileUploader{ 

    private ControlPanel cp; 
    private FormPanel form = new FormPanel(); 
    private FileUpload fu = new FileUpload(); 

    public FileUploader(ControlPanel cp) { 
     this.cp = cp; 
     this.cp.setPrimaryArea(getFileUploaderWidget()); 
    } 

    @SuppressWarnings("deprecation") 
    public Widget getFileUploaderWidget() { 
     form.setEncoding(FormPanel.ENCODING_MULTIPART); 
     form.setMethod(FormPanel.METHOD_POST); 
     // form.setAction(/* WHAT SHOULD I PUT HERE */); 

     VerticalPanel holder = new VerticalPanel(); 

     fu.setName("upload"); 
     holder.add(fu); 
     holder.add(new Button("Submit", new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       GWT.log("You selected: " + fu.getFilename(), null); 
       form.submit(); 
      } 
     })); 

     form.addSubmitHandler(new FormPanel.SubmitHandler() { 
      public void onSubmit(SubmitEvent event) { 
       if (!"".equalsIgnoreCase(fu.getFilename())) { 
        GWT.log("UPLOADING FILE????", null); 
             // NOW WHAT???? 
       } 
       else{ 
        event.cancel(); // cancel the event 
       } 

      } 
     }); 

     form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
      public void onSubmitComplete(SubmitCompleteEvent event) { 
       Window.alert(event.getResults()); 
      } 
     }); 

     form.add(holder); 

     return form; 
    } 
} 

Bây giờ, những gì tôi cần phải làm gì tiếp theo? Tôi cần những gì để đưa vào web.xml và làm thế nào để tôi viết servlet của tôi vì vậy tôi có thể lưu trữ tập tin và gửi lại url của đối tượng đó (nếu có thể)

Trả lời

57

Dưới đây là các mã từ ứng dụng của tôi:

1) Tôi tạo ra một lớp học để chấp nhận yêu cầu http:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class FileUpload extends HttpServlet{ 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ServletFileUpload upload = new ServletFileUpload(); 

     try{ 
      FileItemIterator iter = upload.getItemIterator(request); 

      while (iter.hasNext()) { 
       FileItemStream item = iter.next(); 

       String name = item.getFieldName(); 
       InputStream stream = item.openStream(); 


       // Process the input stream 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       int len; 
       byte[] buffer = new byte[8192]; 
       while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
        out.write(buffer, 0, len); 
       } 

       int maxFileSize = 10*(1024*1024); //10 megs max 
       if (out.size() > maxFileSize) { 
        throw new RuntimeException("File is > than " + maxFileSize); 
       } 
      } 
     } 
     catch(Exception e){ 
      throw new RuntimeException(e); 
     } 

    } 
} 

2) Sau đó, trong web.xml của tôi, tôi đã thêm những dòng này:

<servlet> 
    <servlet-name>fileUploaderServlet</servlet-name> 
    <servlet-class>com.testapp.server.FileUpload</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>fileUploaderServlet</servlet-name> 
    <url-pattern>/testapp/fileupload</url-pattern> 
</servlet-mapping> 

3) Và đối với form.action đã làm điều này:

form.setAction(GWT.getModuleBaseURL()+"fileupload"); 
+1

Tôi đã chính xác như OP: Dự án được lưu trữ trên GAE và tôi muốn tải lên tệp vào máy chủ web Linux của riêng tôi. OP đã chọn câu trả lời của bạn là câu trả lời hay nhất vì vậy tôi đoán nó đã giúp anh ta với câu hỏi của mình nhưng tôi không biết đặt lớp FileUpload ở đâu trong GAE cùng với các tệp dự án khác? Còn máy chủ Linux thì sao? Làm thế nào nó sẽ nhận được các tập tin? Và địa chỉ được chỉ định ở đâu? Và tên tập tin? Tôi bối rối bởi đoạn mã này. –

+3

Không phải 10 MiB "10 * 1024 * 1024" không phải "10 * (1024 * 2)", hay là "megs" một tên thay thế cho 2 KiB? –

+2

10 * (1024 * 2) là 20Kb, nhưng không phải 10Mb – Antonio

5

Trong GWT, bạn có thể đăng tệp lên máy chủ bằng phương thức biểu mẫu http và bạn phải sử dụng HttpServlet được cung cấp để chấp nhận và lưu dữ liệu dưới dạng blog nhị phân trong Appengine BigTable.

Sau đó, bạn cần một HttpServlet thứ hai để đọc tệp từ bigtable, THIẾT LẬP LOẠI MIME TRONG HEADER HTTP {và tùy chọn bộ nhớ đệm}, sau đó truyền tệp cho người dùng.

Mặc dù RPC không cần thiết, bạn phải cho khách hàng biết fileId được tạo ra để họ có thể truy cập nó {trừ khi bạn muốn cho người dùng cung cấp id và buộc họ phải lo lắng về việc ghi đè tên .... ..ick}. Hoặc bạn có thể sử dụng rpc để yêu cầu danh sách/id đơn {like "id tệp mới nhất theo người dùng"} hoặc bạn có thể trả lại id đó trong nội dung phản hồi của UploadServlet ... nhưng sau đó bạn phải đảm bảo mục tiêu bài đăng của mình là iframe trong trang, cuộc thăm dò để đảm bảo iframe có nội dung giữa sự kiện gửi và phản hồi máy chủ thực, sau đó phân tích và sử dụng id đó trong gwt để tạo thẻ img hoặc thẻ đối tượng sử dụng tệp.

Phần quan trọng là có một servlet để tải lên và một phần khác để tải xuống. Hãy nhớ rằng, BigTable chỉ lưu trữ các đốm màu nhị phân, vì vậy bạn cũng cần đối tượng dữ liệu của mình có loại mime/content có thể đọc từ tệp đầu vào {không bao giờ phụ thuộc vào phần mở rộng tệp!}. Ngoài ra, có 1MB cho mỗi thực thể trong BigTable và giới hạn yêu cầu 10MB đối với tài khoản miễn phí. Bạn có thể muốn thực thể dữ liệu của mình chứa danh sách các khối màu từ 1 đến 10, mỗi khối trong số đó là 1024byte tối đa.

Về cơ bản, đặt cược tốt nhất của bạn là tìm bản sao làm việc, miễn phí, như Dịch vụ tệp của Google và mở rộng nó để tìm hiểu cách hoạt động của hệ thống.

Nếu bạn muốn, tôi sẽ đăng phiên bản xử lý tệp nguồn mở của riêng mình, khi tôi hoàn thành các tiện ích kiểm soát gwt và có thể coi nó là đủ ổn định để hữu ích cho bất kỳ ai. Email x AT aiyx DOT thông tin nếu bạn muốn tôi gửi cho bạn một lọ mã nguy hiểm.

11

Tôi khuyên bạn nên sử dụng GWTUpload vì nó chết đơn giản để sử dụng và mở rộng. Bạn có thể thêm nó vào dự án của bạn trong vòng chưa đầy 10 phút và nó hỗ trợ GAE ngay ngoài hộp (sử dụng GWTUpload-GAE). Xem examples đối với một số trường hợp sử dụng phổ biến.

+2

Lưu ý: GWTUpload yêu cầu phiên –

+1

Ưu điểm/nhược điểm của việc sử dụng GWTUpload là gì giải pháp được cung cấp bởi @KevMo – kroiz

+2

GWTUpload cho phép tải lên không đồng bộ với cập nhật trạng thái, tải lên nhiều tệp và hơn thế nữa. Nó có vẻ là một thay thế đầy đủ cho các lựa chọn thay thế Flash phổ biến. – rluba

2

Trừ khi bạn đã sử dụng các khung công tác khác, tôi khuyên bạn nên sử dụng GWT vani trơn và các thành phần gốc của nó. Nếu bạn sử dụng các khung công tác khác, bạn có thể phát nổ kích thước ứng dụng của mình rất nhiều.

Sử dụng các thành phần tự nhiên có thể được thực hiện trong 3 bước sau:

  1. Tạo một file upload servlet
  2. Sửa web.xml
  3. Tạo một Form Tải lên GWT

Điều thú vị đủ, phần GWT là dễ nhất. Bạn có thể sao chép mã của tôi tại GWT Upload in 3 easy steps nếu bạn muốn. Tải lên vui vẻ!

+0

Về cơ bản tôi không thực sự thấy sự khác biệt cho http://stackoverflow.com/a/1111606/787660 do đó, downvote bởi vì tôi nghĩ rằng câu trả lời là chủ yếu là tương tự, nhưng một trong những khác không liên kết ở một nơi khác ... – Chris

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