GWT中的基本file upload

我想弄清楚如何使用GWT的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(如果可能的话)

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

1)我创build了一个类来接受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"); 

我build议使用GWTUpload,因为它很简单,使用和扩展。 您可以在不到10分钟的时间内将其添加到您的项目中,并支持GAE(使用GWTUpload-GAE)。 请参阅示例以了解一些常见的使用场景。

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

然后,您需要第二个HttpServlet从bigtable中读取文件,在HTTP HEADER中设置MIME TYPE(caching选项),然后将文件传输给用户。

尽pipeRPC不是必须的,但是你必须让客户知道生成的fileId是什么,以便他们可以访问它{除非你想让用户提供id,强迫他们担心名字覆盖… …} 。 要么你可以使用rpc来请求一个/单一id的列表(比如“newest file id by user”),或者你可以在UploadServlet的响应主体中返回这个id …但是你必须确保你的post目标是页内iframe,轮询以确保iframe在提交事件和实际服务器响应之间具有主体,然后parsing并使用gwt中的该id创build使用该文件的img或object标记。

关键部分是有一个servlet上传,另一个下载。 请记住,BigTable只是存储二进制blob,所以你还需要你的数据实体有一个MIME /内容types,可以从input文件中读取{从来不依赖于文件扩展名}。 此外,BigTable中的每个实体都有1MB的空间,而免费帐户的空间限制为10MB。 您可能希望让您的数据实体包含1-10个blob列表,每个blob最大为1024字节。

基本上,你最好的办法是find一个免费的工作拷贝,比如Google File Service,并且扩展它来学习系统是如何工作的。

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

除非你已经使用其他框架,否则我强烈build议使用普通的香草GWT,它是本地组件。 如果你使用其他框架,你可以大大的爆炸你的应用程序的大小。

使用本地组件可以分3步完成:

  1. 创build一个file uploadservlet
  2. 修改web.xml
  3. 制作一个GWT上传表单

有趣的是,GWT部分是最简单的。 如果您愿意,可以通过3个简单的步骤将我的代码复制到GWT Upload 。 快乐上传!

在这里你可以使用一个完整的GWTfile upload进度条

在这里输入图像描述

在这里你可以下载源代码