Gwt 文件上载在我的开发环境中工作,但在部署时不起作用

Gwt 文件上载在我的开发环境中工作,但在部署时不起作用,gwt,file-upload,upload,Gwt,File Upload,Upload,我正在使用GWT和谷歌应用程序来托管我的应用程序。由于我对GWT和Web编程都是新手(我大部分时间都在做驱动程序),希望我只是错过了一些东西。 我在网上找到了一些在开发模式下运行良好的示例代码。当我部署时,它不起作用。我已经在Upload类中添加了代码,以便在调用时将数据写入DB,但似乎从未调用我的服务,因为DB从未更改。 包括我正在使用的代码。如果我能去掉JSP代码就太好了,但是我不能实例化Blobstore的东西。将其转移到Java中会很好,但首先要做的是 FileUpload.jsp:

我正在使用GWT和谷歌应用程序来托管我的应用程序。由于我对GWT和Web编程都是新手(我大部分时间都在做驱动程序),希望我只是错过了一些东西。 我在网上找到了一些在开发模式下运行良好的示例代码。当我部署时,它不起作用。我已经在Upload类中添加了代码,以便在调用时将数据写入DB,但似乎从未调用我的服务,因为DB从未更改。 包括我正在使用的代码。如果我能去掉JSP代码就太好了,但是我不能实例化Blobstore的东西。将其转移到Java中会很好,但首先要做的是

FileUpload.jsp:

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
%>


<html>
    <head>
        <title>Upload Test</title>
    </head>
    <body>
        <form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
            <input type="text" name="foo">
            <input type="file" name="myFile" size="50">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>
FileUpload.jsp:
上传测试
丑陋的对话框需要更换,但本质上这是可行的。用户输入文件名并点击提交。现在,在服务器端,我有以下代码:

// Upload.java
public class Upload extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        DebugViaDb.writeDebugData("AA"); // I know my DB write code works as other parts of the code work with the DB
        HttpSession session = req.getSession(true);
        System.out.println("Session is " + session);

        Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
        BlobKey blobKey = blobs.get("myFile");

        if(blobKey == null) {
            res.sendRedirect("/");
        } 
        else {
            res.sendRedirect("/uploadServlet?blob-key=" + blobKey.getKeyString());
        }
    }
}
//Upload.java
公共类上载扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
私有BlobstoreService BlobstoreService=BlobstoreServiceFactory.getBlobstoreService();
public void doPost(HttpServletRequest-req,HttpServletResponse-res)抛出ServletException,IOException{
DebugViaDb.writeDebugData(“AA”);//我知道我的DB write代码与DB的其他部分一样工作
HttpSession session=req.getSession(true);
System.out.println(“会话为”+会话);
Map blobs=blobstoreService.getUploadedBlobs(req);
BlobKey-BlobKey=blobs.get(“myFile”);
if(blobKey==null){
res.sendRedirect(“/”);
} 
否则{
res.sendRedirect(“/uploadServlet?blob key=“+blobKey.getKeyString());
}
}
}
这由JSP调用,JSP反过来调用我的上载servlet:

// UploadServlet.java
public class UploadServlet extends HttpServlet {    
            <edited>

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
            DebugViaDb.writeDebugData("BB");
            BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));

        ...
        }
}
//UploadServlet.java
公共类UploadServlet扩展HttpServlet{
public void doGet(HttpServletRequest-req、HttpServletResponse-res)抛出IOException{
DebugViaDb.writeDebugData(“BB”);
BlobKey BlobKey=新BlobKey(req.getParameter(“blob键”));
...
}
}
My web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee">

<!-- Servlets -->
<servlet>
  <servlet-name>myDataServiceImpl</servlet-name>
  <servlet-class>com.blah.server.MyDataServiceImpl</servlet-class>
</servlet>

<servlet>
  <servlet-name>Upload</servlet-name>
  <servlet-class>com.blah.server.Upload</servlet-class>
</servlet>

<servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.blah.server.UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>myDataServiceImpl</servlet-name>
  <url-pattern>/my/myData</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>Upload</servlet-name>
  <url-pattern>/upload</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>

<!-- Default page to serve -->
<welcome-file-list>
  <welcome-file>my.html</welcome-file>
</welcome-file-list>


</web-app>

myDataServiceImpl
com.blah.server.MyDataServiceImpl
上传
com.blah.server.Upload
上传servlet
com.blah.server.UploadServlet
myDataServiceImpl
/我的/我的数据
上传
/上传
上传servlet
/上传servlet
my.html

所以,问题是,当我在开发模式下运行它时,一切都能完美地工作。部署时,似乎从未调用过“上载”。我被困在服务器上调试这个,所以我不确定到底发生了什么。无法获得日志文件。

首先想到的是,任何处于开发模式的URL都缺少上下文根。因此,如果您的war文件名为myapp.war,则URL看起来会有所不同。有点像这样:

http://127.0.0.1:8888/index.jsp
http://localhost:8080/myapp/index.jsp

当页面刷新时,表单提交会返回什么http代码,假设它确实尝试连接到某个地方?

首先想到的是,任何处于开发模式的URL都缺少上下文根。因此,如果您的war文件名为myapp.war,则URL看起来会有所不同。有点像这样:

http://127.0.0.1:8888/index.jsp
http://localhost:8080/myapp/index.jsp

当页面刷新时,表单提交返回什么http代码,假设它确实尝试连接到某个地方?

问题似乎在于
表单的
操作
标签中设置的URL

尝试打印

   <%= blobstoreService.createUploadUrl("/upload") %>


在开发模式和部署模式中。

问题似乎在于
表单的
操作
中设置的URL

尝试打印

   <%= blobstoreService.createUploadUrl("/upload") %>


在开发模式和部署模式下。

能否打印出服务器上解析为的
blobstoreService.createUploadUrl(“/upload”)
?也许这样做会帮你找到正确的方向。另外,在Firebug中,您是否在NET选项卡中看到对服务器的任何调用?顺便说一句+1,好问题!您能打印出服务器上解析的
blobstoreService.createUploadUrl(“/upload”)
是什么吗?也许这样做会帮你找到正确的方向。另外,在Firebug中,您是否在NET选项卡中看到对服务器的任何调用?顺便说一句+1,好问题!