我正在尝试从表单中发送文件,但是在尝试捕获中无法处理诸如空文件或重文件之类的错误,我也不知道为什么。 这是我的代码:
private String fileValidation( HttpServletRequest request, String chemin, int annee, String mois ) throws FormValidationException {
/*
* Récupération du contenu du champ image du formulaire. Il faut ici
* utiliser la méthode getPart().
*/
String nomFichier = null;
InputStream contenuFichier = null;
try {
Part part = request.getPart( CHAMP_FICHIER );
nomFichier = getNomFichier( part );
System.out.println("nom fichier est: "+ nomFichier);
/*
* Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
* donc d'un champ de type fichier (input type="file").
*/
if ( nomFichier != null && !nomFichier.isEmpty() ) {
/*
* Antibug pour Internet Explorer, qui transmet pour une raison
* mystique le chemin du fichier local à la machine du client...
*
* Ex : C:/dossier/sous-dossier/fichier.ext
*
* On doit donc faire en sorte de ne sélectionner que le nom et
* l'extension du fichier, et de se débarrasser du superflu.
*/
nomFichier = nomFichier.substring( nomFichier.lastIndexOf( '/' ) + 1 )
.substring( nomFichier.lastIndexOf( '\\' ) + 1 );
/* Récupération du contenu du fichier */
contenuFichier = part.getInputStream();
/* Extraction du type MIME du fichier depuis l'InputStream */
MimeUtil.registerMimeDetector( "eu.medsea.mimeutil.detector.MagicMimeMimeDetector" );
String contentType = request.getServletContext().getMimeType( nomFichier );
/*
* Si le fichier est bien une image, alors son en-tête MIME
* commence par la chaîne "image"
*/
if ( contentType.startsWith( "application/pdf" ) ) {
/* Écriture du fichier sur le disque */
String[] fileNameSplits = nomFichier.split("\\.");
int extensionIndex = fileNameSplits.length - 1;
nomFichier = annee+mois + "." + fileNameSplits[extensionIndex];
System.out.println("fichier est: "+nomFichier);
ecrireFichier( contenuFichier, nomFichier, chemin );
} else {
throw new FormValidationException( "Le fichier envoyé doit être un pdf." );
}
}
}catch ( NullPointerException e ) {
/*
* Exception retournée si la taille des données dépasse les limites
* définies dans la section <multipart-config> de la déclaration de
* notre servlet d'upload dans le fichier web.xml
*/
//e.printStackTrace();
throw new FormValidationException( "Le fichier ne doit pas être vide." );
}
catch ( IllegalStateException e ) {
/*
* Exception retournée si la taille des données dépasse les limites
* définies dans la section <multipart-config> de la déclaration de
* notre servlet d'upload dans le fichier web.xml
*/
//e.printStackTrace();
throw new FormValidationException( "Le fichier envoyé ne doit pas dépasser 2Mo." );
}
catch ( IOException e ) {
/*
* Exception retournée si une erreur au niveau des répertoires de
* stockage survient (répertoire inexistant, droits d'accès
* insuffisants, etc.)
*/
e.printStackTrace();
throw new FormValidationException( "Erreur de configuration du serveur." );
} catch ( ServletException e ) {
/*
* Exception retournée si la requête n'est pas de type
* multipart/form-data.
*/
e.printStackTrace();
throw new FormValidationException(
"Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier." );
}
return nomFichier;
}
因此,任何异常(NullPointerException,IllegalStateException,catch(IOException e){ ,ServletException)被处理,这意味着例如当文件为空时,错误消息“ Le vichier ne doit pasêtrevide”不会发送给用户。