Google app engine GWT:form post只在本地服务器上工作,而不在应用程序引擎上工作

Google app engine GWT:form post只在本地服务器上工作,而不在应用程序引擎上工作,google-app-engine,gwt,servlets,post,Google App Engine,Gwt,Servlets,Post,我有一个带有FormPanel、FileUpload和按钮的表单 final FormPanel formPanel = new FormPanel(); formPanel.setAction("uploadServlet"); formPanel.setMethod(FormPanel.METHOD_POST); formPanel.setEncoding(FormPanel.ENCODING_MULTIPART); formPanel.set

我有一个带有FormPanel、FileUpload和按钮的表单

        final FormPanel formPanel = new FormPanel();
    formPanel.setAction("uploadServlet");
    formPanel.setMethod(FormPanel.METHOD_POST);
    formPanel.setEncoding(FormPanel.ENCODING_MULTIPART);
    formPanel.setSize("100%", "100%");
    setWidget(formPanel);


    AbsolutePanel absolutePanel = new AbsolutePanel();
    formPanel.setWidget(absolutePanel);
    absolutePanel.setSize("249px", "70px");

    final FileUpload fileUpload = new FileUpload();
    fileUpload.setName("uploadFormElement");
    absolutePanel.add(fileUpload, 0, 0);

    Button btnOpen = new Button("Open");
    absolutePanel.add(btnOpen, 10, 30);

    Button btnCancel = new Button("Cancel");
    absolutePanel.add(btnCancel, 63, 30);

    this.setText("Open...");
    this.setTitle(this.getText());
    this.setAnimationEnabled(true);
    this.setGlassEnabled(true);

    btnOpen.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) { 
            formPanel.submit();
        }
    });
servlet被调用,但请求包含错误消息“error post”。 当我在本地服务器上尝试它时,它工作正常,请求包含该文件,但在app engine服务器上仅显示错误

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<?> items = null;
    String json = null;     

    try {
        items = upload.parseRequest(request);
    }
    catch (FileUploadException e) {
        e.printStackTrace();
    }
    Iterator<?> it = items.iterator();
    while (it.hasNext()) {
        System.out.println("while (it.hasNext()) {");
        FileItem item = (FileItem) it.next();
        json = item.getString();
    }
    response.setContentType("text/html");

    ServletOutputStream out = response.getOutputStream();
    response.setContentLength(json.length());
    out.write(json.getBytes());
    out.close();
}
public void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
FileItemFactory=new DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
列表项=空;
字符串json=null;
试一试{
items=upload.parseRequest(请求);
}
捕获(文件上载异常){
e、 printStackTrace();
}
Iterator it=items.Iterator();
while(it.hasNext()){
System.out.println(“while(it.hasNext()){”);
FileItem=(FileItem)it.next();
json=item.getString();
}
response.setContentType(“text/html”);
ServletOutputStream out=response.getOutputStream();
response.setContentLength(json.length());
write(json.getBytes());
out.close();
}

DiskFileItemFactory是commons fileupload库的默认实现,它基于javadoc:

此实现创建FileItem实例,这些实例将其内容保存在内存中(对于较小的项目),或者将其内容保存在磁盘上的临时文件中(对于较大的项目)。可以配置大小阈值(超过该阈值,内容将存储在磁盘上),以及创建临时文件的目录。

如果没有其他配置,默认配置值如下:

大小阈值为10KB。Repository是system.getProperty(“java.io.tmpdir”)返回的系统默认临时目录。

所以正如您所看到的,这个实现将在没有足够内存的情况下写入文件系统

在GAE中,有许多限制,比如允许使用的内存,或者禁止在文件系统中写入

您的代码在GAE开发模式下应该会失败,但可能您还没有达到内存限制,或者其他什么,因为GAE dev试图模拟与生产服务器相同的约束,但它并不相同


说,我可以看看图书馆,他们有一个用于GAE的servlet,可以用不同的方式保存文件:BlobStore、FileApi和MemCache。

你能发布你的servlet的重要部分吗?在那里你可以得到文件并将其内容保存到任何地方。我添加了servlet代码