1

当我使用 Apache Tomcat 7.0.34 使用“org.apache.tomcat.util.fileupload”上传文件时,没有显示错误,一切正常。但是当我使用 Apache Tomcat 7.0.40 时,“parseRequest(request)”行中出现了一个错误。我不能说这是一个错误,因为如果我使用 RequestContext,那么错误就会消失,但我不知道如何使用 RequestContext 接口。请帮助我如何使用 RequestContext,因为我需要将实例传递给“parseRequest(RequestContext ctx)”方法。

 public void service(HttpServletRequest request,HttpServletResponse response)
{
    response.setContentType("text/html;charset=UTF-8");         

    String status=null;
    List<FileItem> items=null;

    try
    {      
        if(ServletFileUpload.isMultipartContent(request))
        {             
            items=new ServletFileUpload(new    
    DiskFileItemFactory()).parseRequest(request);
            for(FileItem item:items)
            {                   
                if(item.getFieldName().equals("status"))
                    status=item.getString();
            }  
        }
   }
    catch(Exception e)
    {
       e.printStackTrace();
    }
}   

我需要将 RequestContext 实例放入 parseRequest(RequestContext ctx) 但不知道如何使用 RequestContext。

4

1 回答 1

4

不是在 Servlet 3.0 中处理文件上传的正确方法。您应该@MultipartConfig在 servlet 上使用注释并使用HttpServletRequest#getPart()方法来获取上传的文件,这是在 Servlet 3.0 中引入的。

org.apache.tomcat.util.fileupload包正好包含那些正在完成这个新的 Servlet 3.0 特性的所有“幕后”工作的类。您不应该直接使用它们,就像sun.*在 Sun/Oracle JVM 上使用 Java SE 时不应该使用com.mysql.*类一样,在 MySQL DB 上使用 JDBC 时也不应该使用类。您似乎对使用Apache Commons FileUpload的针对 Servlet 2.5 或更早版本的示例感到困惑,这些示例恰好使用相同的类名。

使用 Tomcat 特定的类会将您的 webapp 与特定的 Tomcat 版本紧密耦合,并使您的 webapp无法移植到其他 Servlet 3.0 兼容容器,甚至无法移植到您遇到的不同 Tomcat 版本。在这种特殊情况下,您应该坚持使用javax.servlet包中的标准类。

此答案的第二部分显示了正确的方法:如何使用 JSP/Servlet 将文件上传到服务器?

总而言之,这个启动示例应该可以帮助您入门:

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="status" />
    <input type="file" name="uploadedFile" />
    <input type="submit" />
</form>

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String status = request.getParameter("status"); // Retrieves <input type="text" name="status">
        Part uploadedFile = request.getPart("uploadedFile"); // Retrieves <input type="file" name="uploadedFile">
        InputStream content = uploadedFile.getInputStream();
        // ... (do your job here)
    }

}

就这样。

于 2013-07-12T12:38:58.080 回答