文件上载在我的开发环境中有效,但在部署时则无效

时间:2012-04-08 04:28:46

标签: gwt file-upload upload

我正在使用GWT和Google Apps托管我的应用。由于我不熟悉GWT和网络编程(我的大部分时间都在做司机),希望我只是遗漏了一些东西。 我在网上找到了一些示例代码,它在开发模式下运行良好。部署时,它不起作用。我已经将代码放在Upload类中,以便在调用时将数据写入数据库,但看起来我的服务调用永远不会发生,因为数据库永远不会更改。 包括我正在使用的代码。如果我能摆脱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>

需要更换的丑陋对话框,但基本上这是有效的。用户输入文件名并点击提交。现在,在服务器端,我有以下代码:

// 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());
        }
    }
}

这由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"));

        ...
        }
}

我的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>

所以,问题是,当我在开发模式下运行时,一切都很完美。当我部署时,看起来好像没有调用“上传”。我在服务器上调试这个问题很困难,所以我不确定是怎么回事。没有运气获得日志文件。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

问题似乎与action form标记 <%= blobstoreService.createUploadUrl("/upload") %> 中设置的网址有关。

尝试打印

的值
{{1}}

在开发和部署模式中。