1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException {
String description = request.getParameter( CHAMP_DESCRIPTION );
request.setAttribute( CHAMP_DESCRIPTION, description );
Part part = request.getPart( CHAMP_FICHIER );
/*
* Il faut déterminer s'il s'agit d'un champ classique ou d'un champ de
* type fichier : on délègue cette opération à une méthode utilitaire
* getNomFichier().
*/
String nomFichier = getNomFichier( part );
if ( nomFichier == null ) {
/*
* La méthode a renvoyé null, il s'agit donc d'un champ classique
* ici (input type="text|radio|checkbox|etc", select, etc).
*/
String nomChamp = part.getName();
/*
* Récupération du contenu du champ à l'aide de notre nouvelle
* méthode
*/
String valeurChamp = getValeur( part );
request.setAttribute( nomChamp, valeurChamp );
} else if ( !nomFichier.isEmpty() ) {
/*
* La méthode a renvoyé quelque chose, il s'agit donc d'un champ de
* type fichier (input type="file").
*/
String nomChamp = part.getName();
request.setAttribute( nomChamp, nomFichier );
}
this.getServletContext().getRequestDispatcher( "/WEB-INF/upload.jsp" ).forward( request, response );
}
/*
* Méthode utilitaire qui a pour unique but d'analyser l'en-tête
* "content-disposition", et de vérifier si le paramètre "filename" y est
* présent. Si oui, alors le champ traité est de type File et la méthode
* retourne son nom, sinon il s'agit d'un champ de formulaire classique et
* la méthode retourne null.
*/
private static String getNomFichier( Part part ) {
/* Boucle sur chacun des paramètres de l'en-tête "content-disposition". */
for ( String contentDisposition : part.getHeader( "content-disposition" ).split( ";" ) ) {
/* Recherche de l'éventuelle présence du paramètre "filename". */
if ( contentDisposition.trim().startsWith( "filename" ) ) {
/*
* Si "filename" est présent, alors renvoi de sa valeur,
* c'est-à-dire du nom de fichier.
*/
return contentDisposition.substring( contentDisposition.indexOf( '=' ) + 1 );
}
}
/* Et pour terminer, si rien n'a été trouvé... */
return null;
}
/*
* Méthode utilitaire qui a pour unique but de lire l'InputStream contenu
* dans l'objet part, et de le convertir en une banale chaîne de caractères.
*/
private String getValeur( Part part ) throws IOException {
BufferedReader reader = new BufferedReader( new InputStreamReader( part.getInputStream(), "UTF-8" ) );
StringBuilder valeur = new StringBuilder();
char[] buffer = new char[1024];
int longueur = 0;
while ( ( longueur = reader.read( buffer ) ) > 0 ) {
valeur.append( buffer, 0, longueur );
}
return valeur.toString();
}
} |
Partager