java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory
我正试图通过ApacheTomcat8.0.14编译java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory,java,servlets,classnotfoundexception,apache-commons-fileupload,Java,Servlets,Classnotfoundexception,Apache Commons Fileupload,我正试图通过ApacheTomcat8.0.14编译UploadServletservlet。 我的web.xml很好,UploadServlet.java已正确编译,但在尝试运行时出现以下错误 错误 HTTP Status 500 - Error instantiating servlet class UploadServlet exception javax.servlet.ServletException: Error instantiating servlet class Upload
UploadServlet
servlet。
我的web.xml很好,UploadServlet.java
已正确编译,但在尝试运行时出现以下错误
错误
HTTP Status 500 - Error instantiating servlet class UploadServlet
exception
javax.servlet.ServletException: Error instantiating servlet class UploadServlet
root cause
java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
root cause
java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
UploadServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;
public class UploadServlet extends HttpServlet {
private boolean isMultipart;
private String filePath;
private int maxFileSize = 50 * 1024;
private int maxMemSize = 4 * 1024;
private File file ;
public void init( ){
filePath = getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ){
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
factory.setRepository(new File("C:\\apache-tomcat-8.0.14\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax( maxFileSize );
try{
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () )
{
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
System.out.println(fileName);
if( fileName.lastIndexOf("\\") >= 0 )
{
file = new File( filePath +
fileName.substring(fileName.lastIndexOf("\\"))) ;
}
else
{
file = new File( filePath +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
throw new ServletException("GET method used with " +
getClass( ).getName( )+": POST method required.");
}
}
import java.io.*;
导入java.util.*;
导入javax.servlet.ServletConfig;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.FileUploadException;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
导入org.apache.commons.io.output.*;
公共类UploadServlet扩展了HttpServlet{
私有布尔是多重的;
私有字符串文件路径;
private int maxFileSize=50*1024;
私有整数maxmesize=4*1024;
私有文件;
公共void init(){
filePath=getServletContext().getInitParameter(“文件上载”);
}
public void doPost(HttpServletRequest请求,
HttpServletResponse(响应)
抛出ServletException,java.io.IOException{
isMultipart=ServletFileUpload.isMultipartContent(请求);
response.setContentType(“text/html”);
java.io.PrintWriter out=response.getWriter();
如果(!isMultipart){
out.println(“”);
out.println(“”);
out.println(“Servlet上传”);
out.println(“”);
out.println(“”);
out.println(“没有上传文件””;
out.println(“”);
out.println(“”);
返回;
}
DiskFileItemFactory=新的DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
setRepository(新文件(“C:\\apache-tomcat-8.0.14\\temp”);
ServletFileUpload upload=新的ServletFileUpload(工厂);
upload.setSizeMax(maxFileSize);
试试{
List fileItems=upload.parseRequest(请求);
迭代器i=fileItems.Iterator();
out.println(“”);
out.println(“”);
out.println(“Servlet上传”);
out.println(“”);
out.println(“”);
而(i.hasNext())
{
FileItem fi=(FileItem)i.next();
如果(!fi.isFormField())
{
字符串fieldName=fi.getFieldName();
字符串文件名=fi.getName();
字符串contentType=fi.getContentType();
布尔值isInMemory=fi.isInMemory();
long-sizeInBytes=fi.getSize();
System.out.println(文件名);
如果(fileName.lastIndexOf(“\\”>)=0)
{
文件=新文件(文件路径+
fileName.substring(fileName.lastIndexOf(“\\”);
}
其他的
{
文件=新文件(文件路径+
fileName.substring(fileName.lastIndexOf(“\\”+1));
}
fi.写入(文件);
out.println(“上传的文件名:“+Filename+”
”;
}
}
out.println(“”);
out.println(“”);
}捕获(例外情况除外){
系统输出打印项次(ex);
}
}
公共无效数据集(HttpServletRequest请求,
HttpServletResponse(响应)
抛出ServletException,java.io.IOException{
抛出新的ServletException(“GET方法用于”+
getClass().getName()+“:需要POST方法。”);
}
}
作为@Gas,我忘了在WEB-INF/lib文件夹中添加.jar文件。然后问题就解决了。您需要将commons fileupload.jar
和commons io.jar
放在WEB-INF/lib
文件夹中。类路径在构建期间使用,但它们也必须在运行时可用
事实上,如果您使用IDE进行JavaEE开发(如Eclipse),将这些JAR放到
WEB-INF/lib
就足够了,因为它们将在CLAPATH for build中自动可见 正如它所说的:类路径上没有类org.apache.commons.fileupload.FileItemFactory您是使用maven构建项目的吗?我不知道maven是什么。仅供参考,我正在使用sublime文本编辑器,无论您在编译commons时使用了什么JAR,也可以在部署时添加它们。我在classpath中提到过它们。commons-io-2.4.jar,commons-fileupload-1.3.1.jar。这还不够吗?您需要将commons-fileupload.jar和commons-io.jar放在WEB-INF/lib文件夹中。类路径在构建期间使用,但它们也必须在运行时可用。