GWT中的基本文件上传

时间:2009-07-10 18:13:09

标签: java google-app-engine gwt file-upload

我正在尝试弄清楚如何使用GWTs FileUpload小部件上传一个文件。我正在使用GWT和谷歌AppEngine与Java,但我想将文件上传到我自己的Linux服务器。 我已经有以下代码,但现在我无法弄清楚如何将我的文件提交到Google AppServer服务器并将其保存到另一台服务器:

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;
    }
}

现在,接下来我需要做什么?我需要在web.xml中放置什么以及如何编写我的servlet以便我可以存储文件并返回该对象的URL(如果可能的话)

5 个答案:

答案 0 :(得分:57)

以下是我的应用中的代码:

1)我创建了一个接受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)然后在我的web.xml中添加了这些行:

<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)对于form.action做了这个:

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

答案 1 :(得分:11)

我建议使用GWTUpload,因为它使用和扩展都很简单。您可以在不到10分钟的时间内将它添加到您的项目中,并且它支持开箱即用的GAE(使用GWTUpload-GAE)。有关常见的使用方案,请参阅examples

答案 2 :(得分:5)

在GWT中,您可以使用http表单方法将文件发布到服务器,并且必须使用提供的HttpServlet接受并将数据保存为Appengine BigTable中的二进制博客。

然后,您需要第二个HttpServlet来读取bigtable中的文件,在HTTP HEADER中设置MIME类型{和缓存选项},然后将文件流式传输给用户。

虽然RPC不是必需的,但您必须让客户端知道生成的fileId是什么,以便他们可以访问它{除非您想让用户提供id并强制他们担心名称覆盖...... .ick}。您可以使用rpc来请求/单个ID列表{例如“用户最新文件ID”},或者您可以在UploadServlet响应的正文中返回该ID ...但是您必须确保您的帖子目标是一个页内iframe,poll来确保iframe在提交事件和实际服务器响应之间有一个主体,然后在gwt中解析并使用该id来创建一个使用该文件的img或object标签。

关键部分是有一个servlet用于上传,另一个用于下载。请记住,BigTable只存储二进制blob,因此您还需要您的数据实体具有可从输入文件中读取的mime / content类型{永远不要依赖文件扩展名!}。此外,BigTable中每个实体有1MB,免费帐户有10MB的请求限制。您可能希望您的数据实体包含1-10个blob的列表,每个blob最多为1024字节。

基本上,您最好的办法是找到一个可用的免费副本,例如Google文件服务,并将其扩展以了解系统的运作方式。

如果你愿意,我将发布我自己的文件处理的开源版本,一旦我完成gwt控件小部件并且可以认为它足够稳定以对任何人都有用。如果您希望我向您发送一罐可疑代码,请发送电子邮件x AT aiyx DOT 信息。

答案 3 :(得分:2)

除非您已经在使用其他框架,否则我强烈建议使用普通的GWT及其本机组件。如果使用其他框架,则可以大大爆炸应用程序的大小。

使用本机组件可以分3个步骤完成:

  1. 创建文件上传servlet
  2. 修改web.xml
  3. 制作GWT上传表格
  4. 有趣的是,GWT部分是最简单的。如果您愿意,可以在GWT Upload in 3 easy steps复制我的代码。快乐上传!

答案 4 :(得分:1)

您可以使用完整的GWT fileupload with Progress bar

enter image description here

您可以 DOWNLOAD 来源