J'utilise le code ci-dessous pour télécharger un fichier dans Tomcat5.5 et cela me donne l'exception suivante
Java.lang.NoClassDefFoundError: org/Apache/commons/io/output/DeferredFileOutputStream
pourriez-vous m'aider à le découvrir?
import Java.io.File;
import Java.io.IOException;
import Java.util.Iterator;
import Java.util.List;
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.FileItemFactory;
import org.Apache.commons.fileupload.FileUploadException;
import org.Apache.commons.fileupload.disk.DiskFileItemFactory;
import org.Apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class FileUploadServlet
*/
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FileUploadServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
@SuppressWarnings("rawtypes")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
System.out.println("Status : "+isMultipart);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();
if (!item.isFormField()) {
String fileName = item.getName();
String root = getServletContext().getRealPath("/");
File path = new File(root + "/uploads");
if (!path.exists()) {
boolean status = path.mkdirs();
}
File uploadedFile = new File(path + "/" + fileName);
System.out.println(uploadedFile.getAbsolutePath());
item.write(uploadedFile);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
response.sendRedirect("upload.jsp");
}
}
c'est le pot que j'utilise commons-fileupload-1.2.2.jar
Le message d'exception particulier vous indique que la classe mentionnée est manquante dans le chemin de classe. Comme le org.Apache.commons.io
conseils de nom de package, la classe mentionnée fait partie de la http://commons.Apache.org/io
projet.
Et en effet, Commons FileUpload a Commons IO comme dépendance . Vous devez télécharger et déposer commons-io.jar
dans le /WEB-INF/lib
ainsi que.
utiliser la dépendance maven
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
ou téléchargez commons-io.1.3.2.jar dans votre dossier lib
Solution
Par défaut, Struts utilise Apache "commons-io.jar" pour son processus de téléchargement de fichiers. Pour y remédier, vous devez inclure cette bibliothèque dans votre dossier de bibliothèque de dépendances de projet.
Obtenez "commons-io.jar" sur le site officiel - http://commons.Apache.org/io/
La meilleure façon est d'obtenir le "commons-io.jar" du référentiel Maven
Fichier: pom.xml
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
il suffit de mettre tout le pot Apache commons et le pot de téléchargement de fichiers dans le dossier lib de Tomcat
Si vous recevez cette erreur dans un conteneur WebSphere, assurez-vous de définir correctement votre stratégie de chargement de classe Apps. J'ai dû changer le mien par défaut en "parent dernier" et également "chargeur de classe unique pour application" pour la politique WAR. En effet, dans mon cas, le commons-io * .jar était fourni avec l'application, il a donc dû être chargé en premier.