GWT 中的基本文件上传

Posted

技术标签:

【中文标题】GWT 中的基本文件上传【英文标题】:Basic File upload in GWT 【发布时间】:2010-11-09 19:32:51 【问题描述】:

我试图弄清楚如何使用 GWTs FileUpload 小部件上传一个文件。我将 GWT 和 Google 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(如果可能)

【问题讨论】:

【参考方案1】:

这是我的应用程序中的代码:

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");

【讨论】:

我与 OP 完全相同:该项目托管在 GAE 上,我想将文件上传到我自己的 Linux Web 服务器。 OP 确实选择了您的答案作为最佳答案,所以我想它确实帮助他解决了他的问题,但我不知道将 FileUpload 类放在哪里,它与其他项目文件一起在 GAE 中吗? Linux 服务器呢?它将如何接收文件?指定的地址在哪里?和文件名?我被这段代码弄糊涂了。 10 MiB 不是“10*1024*1024”不是“10*(1024*2)”,还是“megs”是 2 KiB 的替代名称? 10*(1024*2) 是 20Kb,但不是 10Mb +1,但我希望您添加导入,这样我就不必搜索每一个。它们是:导入 java.io.InputStream;导入 javax.servlet.http.HttpServlet;导入 javax.servlet.http.HttpServletRequest;导入 javax.servlet.http.HttpServletResponse;导入 org.apache.commons.fileupload.FileItemIterator;导入 org.apache.commons.fileupload.FileItemStream;导入 org.apache.commons.fileupload.servlet.ServletFileUpload;导入 org.apache.commons.fileupload.FileUploadException; 我想你忘了说这个JAR应该包含在类路径中:commons.apache.org/fileupload/download_fileupload.cgi【参考方案2】:

我建议使用GWTUpload,因为它的使用和扩展非常简单。您可以在 10 分钟内将其添加到您的项目中,并且它支持开箱即用的 GAE(使用 GWTUpload-GAE)。一些常见的使用场景见examples。

【讨论】:

注意:GWTUpload 需要会话 相比@KevMo 提供的解决方案,使用 GWTUpload 的优缺点是什么 GWTUpload 允许异步上传,包括状态更新、多文件上传等等。它似乎完全替代了常见的 Flash 替代品。【参考方案3】:

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

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

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

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

基本上,最好的办法是找到一个可以工作的免费副本,例如 Google 文件服务,然后扩展它以了解系统的工作原理。

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

【讨论】:

【参考方案4】:

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

使用原生组件可以分 3 步完成:

    创建文件上传servlet 修改web.xml 制作 GWT 上传表单

有趣的是,GWT 部分是最简单的。如果您愿意,可以在GWT Upload in 3 easy steps 复制我的代码。上传快乐!

【讨论】:

基本上我看不出与***.com/a/1111606/787660 的区别,因此投反对票,因为我认为答案大多相似,但另一个没有链接到其他地方......【参考方案5】:

这里有一个完整的GWT fileupload with Progress bar

这里可以DOWNLOAD来源

【讨论】:

以上是关于GWT 中的基本文件上传的主要内容,如果未能解决你的问题,请参考以下文章

GWT与Google App Engine-上传文件

如何使用 GWT 上传文件

GWT 上传/下载最佳实践

是否可以通过 GWT RPC Servlet 上传文件?

GWT文件上传表单提交POST请求无法读取文件

GWT:如何从多部分表单(文件)上传返回(和处理)错误