我想通过“GWT上传”(https://code.google.com/p/gwtupload/)向Google App Engine提供文件上传。在上传过程中,我收到了一个错误。作为UploadAction
servlet,我使用内置版本:gwtupload.server.gae.AppEngineUploadAction
通过以下方式在web.xml中配置servlet:
<context-param>
<!-- max size of the upload request -->
<param-name>maxSize</param-name>
<param-value>3145728</param-value>
</context-param>
<context-param>
<!-- Useful in development mode to slow down the uploads in fast networks.
Put the number of milliseconds to sleep in each block received in the server.
false or 0, means don't use slow uploads -->
<param-name>slowUploads</param-name>
<param-value>200</param-value>
</context-param>
<servlet>
<servlet-name>uploadServlet</servlet-name>
<!-- This is the default servlet, it puts files in session -->
<servlet-class>gwtupload.server.gae.AppEngineUploadAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadServlet</servlet-name>
<url-pattern>*.gupld</url-pattern>
</servlet-mapping>
在上传过程中,进度条会进展一些百分比,然后显示以下错误:
但是日志中没有更多细节。
错误消息显示类gwtupload.server.gae.MemCacheFileItemFactory$CacheableFileItem
,其方法为setHeader()
。这很奇怪,因为我找不到该课程中的方法。这里发生了什么?
修改
这基本上就是我使用的所有自定义代码。在服务器端,我使用gwtupload.server.gae.AppEngineUploadAction
servlet中的构建。
package com.uploadtest.client;
import gwtupload.client.IUploadStatus.Status;
import gwtupload.client.IUploader;
import gwtupload.client.IUploader.UploadedInfo;
import gwtupload.client.MultiUploader;
import gwtupload.client.PreloadedImage;
import gwtupload.client.PreloadedImage.OnLoadPreloadedImageHandler;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class GWTUploadTest2 implements EntryPoint {
// A panel where the thumbnails of uploaded images will be shown
private FlowPanel panelImages = new FlowPanel();
public void onModuleLoad() {
// Attach the image viewer to the document
RootPanel.get("thumbnails").add(panelImages);
// Create a new uploader panel and attach it to the document
MultiUploader defaultUploader = new MultiUploader();
RootPanel.get("default").add(defaultUploader);
// Add a finish handler which will load the image once the upload finishes
defaultUploader.addOnFinishUploadHandler(onFinishUploaderHandler);
}
// Load the image in the document and in the case of success attach it to the viewer
private IUploader.OnFinishUploaderHandler onFinishUploaderHandler = new IUploader.OnFinishUploaderHandler() {
public void onFinish(IUploader uploader) {
if (uploader.getStatus() == Status.SUCCESS) {
new PreloadedImage(uploader.fileUrl(), showImage);
// The server sends useful information to the client by default
UploadedInfo info = uploader.getServerInfo();
System.out.println("File name " + info.name);
System.out.println("File content-type " + info.ctype);
System.out.println("File size " + info.size);
// You can send any customized message and parse it
System.out.println("Server message " + info.message);
}
}
};
// Attach an image to the pictures viewer
private OnLoadPreloadedImageHandler showImage = new OnLoadPreloadedImageHandler() {
public void onLoad(PreloadedImage image) {
image.setWidth("75px");
panelImages.add(image);
}
};
}
除此之外,我还将以下罐子添加到我的clath路径中:
还压缩了我的整个示例项目并将其上传到此处:
https://skydrive.live.com/redir?resid=60B826E451F52B4D!118&authkey=!ALa1n2mL2sRR0wU
编辑2:
像Manolo一样指出:我使用的是“commons-fileupload-1.3.jar”而不是“commons-fileupload-1.2.1.jar”。更改jar修复了我的问题!
答案 0 :(得分:2)
问题在于您使用的commons-fileupload的版本,将其更改为版本1.2.1,这是gwtupload documentation中指向的版本。
它也适用于1.2.2,但使用1.3需要新方法(setHeaders),这些方法不在gwtupload提供的UploadListeners中。
您应该将项目中的目标java(JDK合规性)更改为1.6,因为它是GWT中支持的最后一个以避免问题,尽管它在1.7中运行。