diff --git a/.gitattributes b/.gitattributes
index 10063033727386d4396af5be8c22eb3a5c4cb541..08dc238fcb1e22eaa8b9f7554c82a5e4616d1c8f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -30,6 +30,7 @@ inc/getdocument.php -text
 inc/joindre_document.php -text
 inc/marquer_doublons_doc.php -text
 inc/renseigner_document.php -text
+inc/verifier_document_mode_image.php -text
 inc/verifier_document_mode_vignette.php -text
 inc/vignette.php -text
 javascript/jquery.multifile.js -text
diff --git a/action/ajouter_documents.php b/action/ajouter_documents.php
index 2dff3bd8db00147c321c5b1450aed9c80792c29e..8cbf139f5660fddeeda7c09bc7e28f0a173e709f 100644
--- a/action/ajouter_documents.php
+++ b/action/ajouter_documents.php
@@ -131,8 +131,8 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
 			$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
 		}
 
-		if (!$fichier = fixer_fichier_upload($file))
-			return ("Impossible de telecharger le fichier");
+		if (!is_array($fichier = fixer_fichier_upload($file, $mode)))
+			return is_string($fichier)?$fichier:_T("erreur_upload_type_interdit",array('nom'=>$file['name']));
 		
 		$champs['inclus'] = $fichier['inclus'];
 		$champs['extension'] = $fichier['extension'];
@@ -241,24 +241,40 @@ function corriger_extension($ext) {
 /**
  * Verifie la possibilite d'uploader une extension
  * renvoie un tableau descriptif si l'extension est acceptee
- * une chaine 'zip' si il faut zipper
- * false si l'extension est refusee
+ * avec un index 'autozip' si il faut zipper
+ * false ou message d'erreur si l'extension est refusee
+ * Verifie aussi si l'extension est autorisee pour le mode demande
+ * si on connait le mode a ce moment la
  * 
  */
-function verifier_upload_autorise($source){
+function verifier_upload_autorise($source, $mode=''){
+	$infos = array('fichier'=>$source);
+	$res = false;
 	if (preg_match(",\.([^.]+)$,", $source, $match)
 	  AND $ext = $match[1]){
 		
 	  $ext = corriger_extension(strtolower($ext));
-		if ($row = sql_fetsel("extension,inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
-			return $row;
+		if ($res = sql_fetsel("extension,inclus,media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
+			$infos = array_merge($infos,$res);
+	}
+	if (!$res){
+		if ($res = sql_fetsel("extension,inclus,media", "spip_types_documents", "extension='zip' AND upload='oui'")){
+			$infos = array_merge($infos,$res);
+			$res['autozip'] = true;
+		}
+	}
+	if ($mode AND $res){
+		// verifier en fonction du mode si une fonction est proposee
+		if ($verifier_document_mode = charger_fonction("verifier_document_mode_".$mode,"inc",true)){
+			$check = $verifier_document_mode($infos); // true ou message d'erreur sous forme de chaine
+			if ($check!==true)
+				$res = $check;
+		}
 	}
-		
-	if (sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'"))
-		return 'zip';
 
-	spip_log("Extension $ext interdite a l'upload");
-	return false;
+	if (!$res OR is_string($res));
+		spip_log("Upload $source interdit ($res)",_LOG_INFO_IMPORTANTE);
+	return $res;
 }
 
 
@@ -273,53 +289,55 @@ function verifier_upload_autorise($source){
  * @param array $file //format $_FILES
  * @return array
  */
-function fixer_fichier_upload($file){
+function fixer_fichier_upload($file, $mode=''){
 
-	if (is_array($row=verifier_upload_autorise($file['name']))) {
-		$row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
-		return $row;
-	}
-	// creer un zip comme demande
-	// pour encapsuler un fichier dont l'extension n'est pas supportee
-	elseif($row==='zip'){
+	if (is_array($row=verifier_upload_autorise($file['name'], $mode))) {
+		if (!isset($row['autozip'])){
+			$row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
+			return $row;
+		}
+		// creer un zip comme demande
+		// pour encapsuler un fichier dont l'extension n'est pas supportee
+		else{
 		
-		$row = array('extension'=>'zip','inclus'=>false);
+			unset($row['autozip']);
 
-		$ext = 'zip';
-		if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))
-			return false;
-	
-		spip_unlink($tmp_dir);
-		@mkdir($tmp_dir);
-		
-		include_spip('inc/charset');
-		$tmp = $tmp_dir.'/'.translitteration($file['name']);
-		
-		$file['name'] .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
+			$ext = 'zip';
+			if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))
+				return false;
 
-		// deplacer le fichier tmp_name dans le dossier tmp
-		deplacer_fichier_upload($file['tmp_name'], $tmp, true);
-		
-		include_spip('inc/pclzip');
-		$source = _DIR_TMP . basename($tmp_dir) . '.zip';
-		$archive = new PclZip($source);
-		
-		$v_list = $archive->create($tmp,
-				PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
-				PCLZIP_OPT_ADD_PATH, '');
-		
-		effacer_repertoire_temporaire($tmp_dir);
-		if (!$v_list) {
-			spip_log("Echec creation du zip ");
-			return false;
+			spip_unlink($tmp_dir);
+			@mkdir($tmp_dir);
+
+			include_spip('inc/charset');
+			$tmp = $tmp_dir.'/'.translitteration($file['name']);
+
+			$file['name'] .= '.'.$ext; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
+
+			// deplacer le fichier tmp_name dans le dossier tmp
+			deplacer_fichier_upload($file['tmp_name'], $tmp, true);
+
+			include_spip('inc/pclzip');
+			$source = _DIR_TMP . basename($tmp_dir) . '.'.$ext;
+			$archive = new PclZip($source);
+
+			$v_list = $archive->create($tmp,
+					PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
+					PCLZIP_OPT_ADD_PATH, '');
+
+			effacer_repertoire_temporaire($tmp_dir);
+			if (!$v_list) {
+				spip_log("Echec creation du zip ");
+				return false;
+			}
+
+			$row['fichier']  = copier_document($row['extension'], $file['name'], $source);
+			spip_unlink($source);
+			return $row;
 		}
-		
-		$row['fichier']  = copier_document($row['extension'], $file['name'], $source);
-		spip_unlink($source);
-		return $row;
 	}
-	
-	return false;
+	else
+		return $row; // retourner le message d'erreur
 }
 
 /**
@@ -335,9 +353,6 @@ function verifier_taille_document_acceptable($infos){
 		if (_DOC_MAX_SIZE > 0
 		 AND $infos['taille'] > _DOC_MAX_SIZE*1024)
 			return _T('medias:info_doc_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
-
-		if ($infos['mode'] == 'image')
-			return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier']));
 	}
 	
 	// si c'est une image
diff --git a/inc/joindre_document.php b/inc/joindre_document.php
index e5a57a11972a432460bad4b60fdd4ba5d0c4d51a..68d26d0aaf797d4eacdbb394f1b18446ddff24ef 100644
--- a/inc/joindre_document.php
+++ b/inc/joindre_document.php
@@ -47,7 +47,7 @@ function joindre_trouver_fichier_envoye(){
 						if (!($test['error'] == 4)){
 							if (is_string($err = joindre_upload_error($test['error'])))
 								return $err; // un erreur upload
-							if (!verifier_upload_autorise($test['name']))
+							if (!is_array(verifier_upload_autorise($test['name'])))
 								return _T('medias:erreur_upload_type_interdit',array('nom'=>$test['name']));
 							$files[]=$test;
 						}
@@ -58,7 +58,7 @@ function joindre_trouver_fichier_envoye(){
 					if (!($file['error'] == 4)){
 						if (is_string($err = joindre_upload_error($file['error'])))
 							return $err; // un erreur upload
-						if (!verifier_upload_autorise($file['name']))
+						if (!is_array(verifier_upload_autorise($file['name'])))
 							return _T('medias:erreur_upload_type_interdit',array('nom'=>$file['name']));
 						$files[]=$file;
 					}
diff --git a/inc/verifier_document_mode_image.php b/inc/verifier_document_mode_image.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b2afbe5e2bb610a79a5e5d14290edd401401058
--- /dev/null
+++ b/inc/verifier_document_mode_image.php
@@ -0,0 +1,26 @@
+<?php
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function inc_verifier_document_mode_image_dist($infos){
+
+	// Si on veut uploader une image, il faut qu'elle ait ete bien lue
+	if ($infos['inclus'] != 'image')
+		return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG
+
+	if (isset($infos['largeur']) AND isset($infos['hauteur'])){
+		if (!($infos['largeur'] OR $infos['hauteur']))
+			return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier']));
+	}
+
+	return true;
+}
\ No newline at end of file
diff --git a/inc/verifier_document_mode_vignette.php b/inc/verifier_document_mode_vignette.php
index 8317652844225c3f1195d44b09a7ecde828b3572..9b829117cda523de108bcfde7a0c29c347d08294 100644
--- a/inc/verifier_document_mode_vignette.php
+++ b/inc/verifier_document_mode_vignette.php
@@ -17,8 +17,10 @@ function inc_verifier_document_mode_vignette_dist($infos){
 	if ($infos['inclus'] != 'image')
 		return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG
 
-	if (!($infos['largeur'] OR $infos['hauteur']))
-		return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier']));
+	if (isset($infos['largeur']) AND isset($infos['hauteur'])){
+		if (!($infos['largeur'] OR $infos['hauteur']))
+			return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier']));
+	}
 
 	return true;
 }
\ No newline at end of file