我正在建立一个休息服务,以便通过发帖请求上传文件。 我有两个servlet,首先接收请求并更改URI,以调用blob键,然后将请求转发到将要保存文件的servlet。
我的servlet如下:
uploadfiles.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package costache.examproject;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Gabriel
*/
public class uploadfiles extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
String bloblink = blobstoreService.createUploadUrl("/upload");
String[] linkcut = bloblink.split("_ah");
String newUri = "_ah" + linkcut[1];
request.getRequestDispatcher(newUri).forward(request, response);
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
upload.java
package costache.examproject;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
public class upload extends HttpServlet {
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
List<BlobKey> blobKeys = blobs.get("myFile");
if (blobKeys == null || blobKeys.isEmpty()) {
res.sendRedirect("/");
} else {
res.sendRedirect("/serve?blob-key=" + blobKeys.get(0).getKeyString());
}
}
}
如果我尝试通过帖子发送文件,它将在本地运行(调试器会触发两个servlet的每个点),但是一旦部署在GAE上却没有,它会返回“错误:未找到”
表单HTML:
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>TODO supply a title</title>
<meta charset="windows-1252">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>TODO write content</div>
<form action="uploadfiles" method="post" enctype="multipart/form-data">
Nome: <input id="n" type="text" name="foo">
Consumer: <input id="c" type="text" name="consumer">
Uploader: <input id="u" type="text" name="uploader">
Contenuto: <input id="co" type="file" name="myFile">
<input type="submit" />
</form>
</body>
</html>
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 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">
<display-name>examproject</display-name>
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>filters.OfyStarter</listener-class>
</listener>
<servlet>
<servlet-name>registrazione</servlet-name>
<servlet-class>costache.examproject.registrazione</servlet-class>
</servlet>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>costache.examproject.login</servlet-class>
</servlet>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>costache.examproject.upload</servlet-class>
</servlet>
<servlet>
<servlet-name>serve</servlet-name>
<servlet-class>costache.examproject.serve</servlet-class>
</servlet>
<servlet>
<servlet-name>caricafile</servlet-name>
<servlet-class>costache.examproject.caricafile</servlet-class>
</servlet>
<servlet>
<servlet-name>upload2</servlet-name>
<servlet-class>costache.examproject.upload2</servlet-class>
</servlet>
<servlet>
<servlet-name>uploadfiles</servlet-name>
<servlet-class>costache.examproject.uploadfiles</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>registrazione</servlet-name>
<url-pattern>/registrazione</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>serve</servlet-name>
<url-pattern>/serve</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>caricafile</servlet-name>
<url-pattern>/caricafile</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>upload2</servlet-name>
<url-pattern>/upload2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>uploadfiles</servlet-name>
<url-pattern>/uploadfiles</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>costache</groupId>
<artifactId>examproject-247809</artifactId>
<packaging>war</packaging>
<version>3</version>
<name>test3</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.82.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.appengine.tools</groupId>
<artifactId>appengine-gcs-client</artifactId>
<version>0.8</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.objectify</groupId>
<artifactId>objectify</artifactId>
<version>5.1.22</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>1.9.64</version>
</plugin>
</plugins>
</build>
</project>
另一个问题是注释不起作用,如果我尝试@MultiPartConfig或@WebServlet,它们实际上什么也没做。