Mak*_*sim 45 java gwt google-app-engine 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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,接下来我需要做什么?我需要在web.xml中放入什么以及如何编写我的servlet以便我可以存储文件并返回该对象的URL(如果可能的话)
Kev*_*vMo 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
3)对于form.action做了这个:
form.setAction(GWT.getModuleBaseURL()+"fileupload");
Run Code Online (Sandbox Code Playgroud)
rlu*_*uba 11
我建议使用GWTUpload,因为它易于使用和扩展.您可以在不到10分钟的时间内将它添加到您的项目中,并且它支持开箱即用的GAE(使用GWTUpload-GAE).有关常见使用方案,请参阅示例.
小智 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控件小部件并且可以认为它足够稳定以对任何人都有用.如果您希望我向您发送一罐可疑代码,请发送电子邮件至AT aiyx DOT信息.
| 归档时间: |
|
| 查看次数: |
91887 次 |
| 最近记录: |