Comment uploader un fichier avec Java (jsp) ?

Je vais vous expliquer une manière d’upload de fichier parmi d’autre en Java (Jsp), il existe plusieurs solution dont certain frameworks, mais dans cette exemple je vais vous expliquez uniquement avec les outils de base de Java via l’ import java.io.File.

Le but est donc de faire un upload de fichier vers un emplacement disque sur réseau, valider une extension de fichier et copier le chemin du fichier en base de données.

 Avant toute chose il vous faut définir un formulaire dans votre Jsp.

 

<div class="content">  
<div class="page-content">  
 <!– CONTENT –>
 <h3>Gestion des uploads</h3>
  <p>Formulaire d'envoie de fichier</p>
 
<!– Ici le /Upload est ma servlet qui va gérer l'upload elle est bien sur définie dans le web.xml –>
  <form action="<%=request.getContextPath()%>/Upload"    enctype="multipart/form-data" method="post">
  <p><input type="file" name="file1" />
  <input type="submit" value="Envoyer" /></p>
  </form>              
  <!– END CONTENT –>
  </div>
  </div>

Voici la définition et le fonctionnement de la servlet Uplaod.

N’oubliez pas les import.

package be.ledconcept.rl.servlets;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import be.ledconcept.rl.uploadFiles.UploadFileOnServer;
import be.ledconcept.rl.uploadFiles.UploadInterface;
 
/**
 * Servlet implementation class UploadFile
 */
@WebServlet("/UploadFile")
public class Upload extends HttpServlet {
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
*      response)
*/
 protected void doGet(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException {
 response.setContentType("text/html");
 PrintWriter out = response.getWriter();
 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>Contrôle d'accès</TITLE></HEAD>");
out.println("  <BODY>");
out.println("  <BR />Pour visualiser les pages, veuillez passer par la page de connexion de la plateforme.");
out.println("  <A HREF='/LedConcept/index.jsp'>Me connecter</A>");
out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
 
  /**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
 protected void doPost(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException {
 // on appel la méthode d'uplaod et on redirige sur page de validation ou
// d'erreur suivant le résultat
 
//la méthode est appelée par une interface
UploadInterface upload = new UploadFileOnServer();
if (!upload.UploadFile(request)) {
response.sendRedirect("jsp/error/uploadError.jsp");
 }
else {
response.sendRedirect("jsp/validation/validationUpload.jsp");
}
}
}

Dans un premier temps je définis un DoGet avec une redirection, cela ajoute une petite sécurité supplémentaire.

Je n’appele pas la méthode proprement dite, mais j’appel sont interface, à titre d’information vous trouverez le contenu de l’interface ci-dessous.

package be.ledconcept.rl.uploadFiles;
 
import javax.servlet.http.HttpServletRequest;
 
/**
 * Interface pour l'upload de fichier vers le serveur
 *
 * @author ryle
 *
 */
 
public interface UploadInterface {
 
 /**
* Interface de l'upload
*
* @author ryle
* @param request
*            : le fichier à uploader
* @return Boolean : si le fichier à la bonne extention alors la méthode
*         retourne True, si le fichier n'a pas la bonne extension alors la
*         méthode retourne False
 */
 public Boolean UploadFile(HttpServletRequest request);
}

Nous arrivons maintenant à la partie la plus intéressante, voici la classe qui va permettre de valider l’extension du fichier pour ensuite le copier sur un emplacement disque et intégrer sont emplacement dans la base de données.

Bien sûr je ne vais pas détailler ici le principe de connexion au Db et les requêtes qui y sont liées.

package be.ledconcept.rl.uploadFiles;
 
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
 
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.FilenameUtils;
import org.apache.log4j.Logger;
 
import be.ledconcept.dao.constant.Constant;
import be.ledconcept.dao.rl.addDocumentLink.AddDocumentLinkDAO;
import be.ledconcept.dao.rl.addDocumentLink.AddDocumentLinkMySqlImpl;
 
/**
 * Classe de méthode pour la gestion des uploades
 *
 * @author ryle
 *
 */
public class UploadFileOnServer implements UploadInterface {
 
  /**
  * Méthode pour l'upload de fichier sur le disque dur
*
* @author ryle
* @param reques
*            : le fichier à uploader
*  @return Boolean : si le fichier à la bonne extention alors la méthode
*         retourne True, si le fichier n'a pas la bonne extension alors la
*         méthode retourne False
*/
public Boolean UploadFile(String id, HttpServletRequest request) {
Boolean validation = false;
 
// On prépare les extension de fichier qui seront accepter en upload
List<String> listOfExtensions = new ArrayList<String>(5);
listOfExtensions.add("pdf");
listOfExtensions.add("doc");
listOfExtensions.add("docx");
listOfExtensions.add("xls");
listOfExtensions.add("xlsx");
 
// Création du format de la date pour le répertoire de stockage sur le disque
SimpleDateFormat dateFormatDirectory = new SimpleDateFormat("yyyy");
String dateDirectory = dateFormatDirectory.format(new Date());
// Création du format de la date pour le fichier, il sera donc renomer
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy_MM_dd-HH-mm-ss");
String date = dateFormat.format(new Date());
 
// on prépare pour l'envoie par la mise en oeuvre en mémoire
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
 
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
try {
List<FileItem> items = (List<FileItem>) uploadHandler
.parseRequest(request);
 
Iterator<FileItem> itr = (Iterator<FileItem>) items.iterator();
// au besoin on creer le dossier principal des archive et le sous
// dossier qui correspond à l'année en cour
new File(Constant.dossierUplaod + dateDirectory).mkdirs();
 
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
 
// on récupère l'extension du fichier qui est uploader
String fileExtensionName = item.getName();
fileExtensionName = FilenameUtils
.getExtension(fileExtensionName);
 
// on donne le chemin d'écriture au fichier ainsi que sont nom
// et on le met dans l'année en cours
File file = new File(Constant.dossierUplaod + dateDirectory, id + "_"
+ date + "." + fileExtensionName);
 
// on vérifie si les extensions des fichier uploader sont
// acceptée ou pas
if (listOfExtensions.contains(fileExtensionName)) {
// on écrit le fichier sur le disque dur
item.write(file);
 
// on écrit les informations de l'upload dans la db
AddDocumentLinkDAO documentLink = new AddDocumentLinkMySqlImpl();
 
try {
documentLink.addDocumentLink(file.getName(),
 
//on récupère le chemin absolue du fichier
 
file.getAbsolutePath());
 
// on valide pour la valeur de retour;
validation = true;
}
catch (Exception e) {
e.printStackTrace();
}
}
else {
log.error("L'extention du fichier n'est pas valide");
}
}
}
catch (FileUploadException ex) {
ex;
}
 
catch (Exception ex) {
ex;
}
return validation;
}
}

Voilà vous avez maintenant les informations pour faire un upload de fichier sur disque avec copie du lien absolu en dB et une vérification de l’extension du fichier avant upload.

Tags: , ,

top ryle software gd

Besoin d'information ? Une question ?
Suivez-nous sur nos différents réseaux sociaux

Contact

 6041 Charleroi - (Sur Rendez-vous).

 +32  (0) 460 21 40 45

 info@rylesoftware.com

 Lun - Ven: 8:00 - 18:00

BE 0862 316 043 - C.G.V. - Vie Privée

FB Twitter