【问题标题】:JSP upload File failedJSP 上传文件失败
【发布时间】:2013-07-09 12:45:59
【问题描述】:

我将构建一个简单的 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() );
        }
    }


}

【问题讨论】:

  • 您可以在 BalusC 的博客条目中找到解决方案:balusc.blogspot.com/2009/12/…。搜索ClassCastException(从您在我的回答中的评论重定向)。
  • 仍然无法改变...

标签: file jsp http upload


【解决方案1】:

当您在不使用标准的情况下从具有 enctype=multipart/form-data 的表单获取参数时,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()) { //...

有关更多信息,请参阅此其他帖子。

【讨论】:

    【解决方案2】:

    这是由于不正确的导入造成的。下载此jar 并将其放在 WEB-INF/lib 文件夹中。以防其他人仍在寻找这个(就像我一样)下面列出的正确导入。

    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 2013-06-09
      • 2012-03-18
      • 1970-01-01
      • 2020-06-12
      • 2012-05-31
      相关资源
      最近更新 更多