我将建立一个简单的jspfile来使用Servlet处理上传文件。当执行时,它显示以下消息
demo Fail: org.apache.catalina.connector.RequestFacade cannot be cast to org.apache.tomcat.util.http.fileupload.RequestContext
您能告诉我如何将HTTP请求转换为RequestContext吗?
下面是我的jsp首页代码
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title Test Upload</title> </head> <body> <form action="uploadFile" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" /> </form> </body> </html>
以下是我的Servlet代码
import java.io.*; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.sql.*; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import javax.servlet.*; import javax.servlet.http.*; import org.apache.tomcat.util.http.fileupload.FileItem; import org.apache.tomcat.util.http.fileupload.FileItemFactory; import org.apache.tomcat.util.http.fileupload.FileUploadException; import org.apache.tomcat.util.http.fileupload.RequestContext; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class getLogin */ public class uploadFile extends HttpServlet { private static final long serialVersionUID = 17864986468494864L; // location to store file uploaded private static final String UPLOAD_DIRECTORY = "upload"; // upload settings public uploadFile() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //doPost(request, response); //throw new ServletException("GET method used with " + getClass( ).getName( )+": POST method required."); request.getRequestDispatcher("/WEB-INF/upload.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo"); if (!ServletFileUpload.isMultipartContent(request)) { // if not, we stop here PrintWriter writer = response.getWriter(); writer.println("Error: Form must has enctype=multipart/form-data."); writer.flush(); return; } // configures upload settings DiskFileItemFactory factory = new DiskFileItemFactory(); // sets temporary location to store files factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // constructs the directory path to store upload file // this path is relative to application's directory String uploadPath = getServletContext().getRealPath("")+ File.separator + UPLOAD_DIRECTORY; // creates the directory if it does not exist File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } try { // parses the request's content to extract file data System.out.println(uploadPath); List<FileItem> formItems = upload.parseRequest((RequestContext)request); if (formItems != null && formItems.size() > 0) { // iterates over form's fields for (FileItem item : formItems) { // processes only fields that are not form fields if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); // C:\tomcat\apache-tomcat-7.0.40\webapps\data\ // saves the file on disk item.write(storeFile); request.setAttribute("message","Upload has been done successfully!"); System.out.println("demo Success"); } } } } catch (Exception ex) { request.setAttribute("message","There was an error: " + ex.getMessage()); System.out.println("demo Fail: " + ex.getMessage() ); } } }
当您从具有enctype = multipart / form-data的Form中获取参数而不使用标准时,在Tomcat 7和Servlet 3.0上会出现此错误尝试
@WebServlet("/yourPattern") @MultipartConfig public class UploadFile extends HttpServlet { //...
然后使用Part对象作为
Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file"> InputStream filecontent = filePart.getInputStream();
代替
List<FileItem> formItems = upload.parseRequest((RequestContext)request); if (formItems != null && formItems.size() > 0) { // iterates over form's fields for (FileItem item : formItems) { if (!item.isFormField()) { //...
有关更多信息,请参见此其他文章。