Example #1
0
/**
 * Ajouter un document (au format $_FILES)<br>
 * (n'ajoute pas le contenu en base dans spip_documents...)
 * 
 * @param  string $source      Le fichier sur le serveur (/var/tmp/xyz34)
 * @param  string $nom_envoye  Son nom chez le client (portequoi.pdf)
 * @param  string $nom_dest    Le nom sous lequel le sauvegarder
 * @param  string $dans        Où l'enregistrer
 * @return string
 */
function cfg_ajoute_un_document($source, $nom_envoye, $nom_dest, $dans='config') {

	include_spip('inc/modifier');
	include_spip('inc/ajouter_documents');
	
	$type_image = ''; // au pire
	// tester le type de document :
	// - interdit a l'upload ?
	// - quelle extension dans spip_types_documents ?
	// - est-ce "inclus" comme une image ?

	preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match);
	@list(,$titre,$ext) = $match;
	$ext = corriger_extension(strtolower($ext));
	// ajouter l'extension au nom propose...
	$row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'");

	if ($row) {
		$type_inclus_image = ($row['inclus'] == 'image');
		// hum stocke dans IMG/$ext ?
		$fichier = cfg_copier_document($ext, $nom_dest.'.'.$ext, $source, $dans);
	} else {

/* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */
		$type_inclus_image = false;

		if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) {
			spip_log("Extension $ext interdite a l'upload");
			return;
		}

		$ext = 'zip';
		if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return;
		spip_unlink($tmp_dir); @mkdir($tmp_dir);
		$tmp = $tmp_dir.'/'.translitteration($nom_envoye);
		$nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
		_COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $tmp) : deplacer_fichier_upload($source, $tmp);
		include_spip('inc/pclzip');
		$source = _DIR_TMP . 'archive.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;
		}
		// hum too ?
		$fichier = cfg_copier_document($ext, $nom_dest.'.zip', $source, $dans);
		spip_unlink($source);
	}

	if ($ext == "svg") {
		// supprimer les scripts
		traite_svg($fichier);
	} elseif ($ext != "mov") {// image ?
		// Si c'est une image, recuperer sa taille et son type (detecte aussi swf)
		$size_image = @getimagesize($fichier);
		$type_image = decoder_type_image($size_image[2]);
	}

	// Quelques infos sur le fichier
	if (!$fichier OR !@file_exists($fichier)
	OR !$taille = @intval(filesize($fichier))) {
		spip_log ("Echec copie du fichier $fichier");
		return;
	}

	if (!$type_image) {
		if (_DOC_MAX_SIZE > 0
		AND $taille > _DOC_MAX_SIZE*1024) {
			spip_unlink ($fichier);
			check_upload_error(6,
			_T('info_logo_max_poids',
				array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024),
				'actuel' => taille_en_octets($taille))));
		}
	}
	else { // image
		if (_IMG_MAX_SIZE > 0
		AND $taille > _IMG_MAX_SIZE*1024) {
			spip_unlink ($fichier);
			check_upload_error(6,
			_T('info_logo_max_poids',
				array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024),
				'actuel' => taille_en_octets($taille))));
		}

		if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
		AND ($size_image[0] > _IMG_MAX_WIDTH
		OR $size_image[1] > _IMG_MAX_HEIGHT)) {
			spip_unlink ($fichier);
			check_upload_error(6, 
			_T('info_logo_max_taille',
				array(
				'maxi' =>
					_T('info_largeur_vignette',
						array('largeur_vignette' => _IMG_MAX_WIDTH,
						'hauteur_vignette' => _IMG_MAX_HEIGHT)),
				'actuel' =>
					_T('info_largeur_vignette',
						array('largeur_vignette' => $size_image[0],
						'hauteur_vignette' => $size_image[1]))
			)));
		}
	}

	return $fichier;
}
Example #2
0
function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect)
{
	$ajouter_documents = charger_fonction('ajouter_documents', 'inc');

	if (function_exists('gzopen') 
	AND !($mode == 'distant')
	AND (count($files) == 1)
	AND (preg_match('/\.zip$/i', $files[0]['name'])
	     OR ($files[0]['type'] == 'application/zip'))) {
	
	  // on pose le fichier dans le repertoire zip 
	  // (nota : copier_document n'ecrase pas un fichier avec lui-meme
	  // ca autorise a boucler)
		$desc = $files[0];
		$zip = copier_document("zip",
					$desc['name'],
					$desc['tmp_name']
				);
		// Est-ce qu'on sait le lire ?
		include_spip('inc/pclzip');
		$archive = $zip ? new PclZip($zip) : '';
		if ($archive) {
			$valables = verifier_compactes($archive);
			if ($valables) {
				if (rename($zip, $tmp = _DIR_TMP.basename($zip))) {
					echo $ajouter_documents($valables, $tmp, $type, $id, $mode, $id_document, $actifs, $hash, $redirect, $iframe_redirect);
	// a tout de suite en joindre4, joindre5, ou joindre6
					exit;
				}
			}
		}
	}

	foreach ($files as $arg) {
		// verifier l'extension du fichier en fonction de son type mime
		list($extension,$arg['name']) = fixer_extension_document($arg);
		check_upload_error($arg['error']);
		$x = $ajouter_documents($arg['tmp_name'], $arg['name'], 
				    $type, $id, $mode, $id_document, $actifs);
	}
	// un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique
	include_spip('inc/invalideur');
	suivre_invalideur("id='id_$type/$id'");
	return $x;
}
Example #3
0
function action_spip_image_ajouter_dist($arg,$sousaction2,$source) {
	global $formats_logos;

	include_spip('inc/getdocument');
	if (!$sousaction2) {
		if (!$_FILES) $_FILES = $GLOBALS['HTTP_POST_FILES'];
		$source = (is_array($_FILES) ? array_pop($_FILES) : "");
	}
	if ($source) {
		$f =_DIR_LOGOS . $arg . '.tmp';

		if (!is_array($source)) 
		// fichier dans upload/
	  		$source = @copy(determine_upload() . $source, $f);
		else {
		// Intercepter une erreur a l'envoi
			if (check_upload_error($source['error']))
				$source ="";
			else
		// analyse le type de l'image (on ne fait pas confiance au nom de
		// fichier envoye par le browser : pour les Macs c'est plus sur)

				$source = deplacer_fichier_upload($source['tmp_name'], $f);
		}
	}
	if (!$source)
		spip_log("pb de copie pour $f");
	else {
		$size = @getimagesize($f);
		$type = !$size ? '': ($size[2] > 3 ? '' : $formats_logos[$size[2]-1]);
		if ($type) {
			$poids = filesize($f);

			if (_LOGO_MAX_SIZE > 0
			AND $poids > _LOGO_MAX_SIZE*1024) {
				spip_unlink ($f);
				check_upload_error(6,
				_T('info_logo_max_poids',
					array('maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024),
					'actuel' => taille_en_octets($poids))));
			}

			if (_LOGO_MAX_WIDTH * _LOGO_MAX_HEIGHT
			AND ($size[0] > _LOGO_MAX_WIDTH
			OR $size[1] > _LOGO_MAX_HEIGHT)) {
				spip_unlink ($f);
				check_upload_error(6, 
				_T('info_logo_max_taille',
					array(
					'maxi' =>
						_T('info_largeur_vignette',
							array('largeur_vignette' => _LOGO_MAX_WIDTH,
							'hauteur_vignette' => _LOGO_MAX_HEIGHT)),
					'actuel' =>
						_T('info_largeur_vignette',
							array('largeur_vignette' => $size[0],
							'hauteur_vignette' => $size[1]))
				)));
			}
			@rename ($f, _DIR_LOGOS . $arg . ".$type");
		}
		else {
			spip_unlink ($f);
			check_upload_error(6,_T('info_logo_format_interdit',
						array('formats' => join(', ', $formats_logos))));
		}
	
	}
}
Example #4
0
/**
 * @param string $objet
 * @param int $id_objet
 * @param string $etat
 *   on ou off
 * @param string|array $source
 *   array : sous tableau de $_FILE issu de l'upload
 *   string : fichier source (chemin complet ou chemin relatif a tmp/upload)
 * @return string
 */
function logo_modifier($objet, $id_objet, $etat, $source)
{
    $chercher_logo = charger_fonction('chercher_logo', 'inc');
    $objet = objet_type($objet);
    $primary = id_table_objet($objet);
    include_spip('inc/chercher_logo');
    $type = type_du_logo($primary);
    // nom du logo
    $nom = $type . $etat . $id_objet;
    // supprimer le logo eventueel existant
    logo_supprimer($objet, $id_objet, $etat);
    include_spip('inc/documents');
    $erreur = "";
    if (!$source) {
        spip_log("spip_image_ajouter : source inconnue");
        $erreur = "source inconnue";
        return $erreur;
    }
    $file_tmp = _DIR_LOGOS . $nom . '.tmp';
    $ok = false;
    // fichier dans upload/
    if (is_string($source)) {
        if (file_exists($source)) {
            $ok = @copy($source, $file_tmp);
        } elseif (file_exists($f = determine_upload() . $source)) {
            $ok = @copy($f, $file_tmp);
        }
    } elseif (!($erreur = check_upload_error($source['error'], "", true))) {
        // analyse le type de l'image (on ne fait pas confiance au nom de
        // fichier envoye par le browser : pour les Macs c'est plus sur)
        $ok = deplacer_fichier_upload($source['tmp_name'], $file_tmp);
    }
    if ($erreur) {
        return $erreur;
    }
    if (!$ok or !file_exists($file_tmp)) {
        spip_log($erreur = "probleme de copie pour {$file_tmp} ");
        return $erreur;
    }
    $size = @getimagesize($file_tmp);
    $type = !$size ? '' : ($size[2] > 3 ? '' : $GLOBALS['formats_logos'][$size[2] - 1]);
    if ($type) {
        @rename($file_tmp, $file_tmp . ".{$type}");
        $file_tmp = $file_tmp . ".{$type}";
        $poids = filesize($file_tmp);
        if (defined('_LOGO_MAX_WIDTH') or defined('_LOGO_MAX_HEIGHT')) {
            if (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH or defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT) {
                $max_width = (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : '*';
                $max_height = (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : '*';
                // pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures
                // on met directement a la taille maxi a la volee
                if (isset($GLOBALS['meta']['creer_preview']) and $GLOBALS['meta']['creer_preview'] == 'oui') {
                    include_spip('inc/filtres');
                    $img = filtrer('image_reduire', $file_tmp, $max_width, $max_height);
                    $img = extraire_attribut($img, 'src');
                    $img = supprimer_timestamp($img);
                    if (@file_exists($img) and $img !== $file_tmp) {
                        spip_unlink($file_tmp);
                        @rename($img, $file_tmp);
                        $size = @getimagesize($file_tmp);
                    }
                }
                // verifier au cas ou image_reduire a echoue
                if (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH or defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT) {
                    spip_unlink($file_tmp);
                    $erreur = _T('info_logo_max_poids', array('maxi' => _T('info_largeur_vignette', array('largeur_vignette' => $max_width, 'hauteur_vignette' => $max_height)), 'actuel' => _T('info_largeur_vignette', array('largeur_vignette' => $size[0], 'hauteur_vignette' => $size[1]))));
                }
            }
        }
        if (!$erreur and defined('_LOGO_MAX_SIZE') and _LOGO_MAX_SIZE and $poids > _LOGO_MAX_SIZE * 1024) {
            spip_unlink($file_tmp);
            $erreur = _T('info_logo_max_poids', array('maxi' => taille_en_octets(_LOGO_MAX_SIZE * 1024), 'actuel' => taille_en_octets($poids)));
        }
        if (!$erreur) {
            @rename($file_tmp, _DIR_LOGOS . $nom . ".{$type}");
        }
    } else {
        spip_unlink($file_tmp);
        $erreur = _T('info_logo_format_interdit', array('formats' => join(', ', $GLOBALS['formats_logos'])));
    }
    return $erreur;
}
Example #5
0
function vignette_revision($id, $data, $type, $ref)
{
    $s = sql_fetsel("id_document,id_vignette", "spip_documents", "id_document=" . intval($id));
    if (!is_array($s)) {
        return false;
    }
    include_spip('inc/modifier');
    include_spip('inc/documents');
    include_spip('action/editer_document');
    //pour revision_document
    // Chargement d'un nouveau doc ?
    if ($data['vignette']) {
        define('FILE_UPLOAD', true);
        if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
            spip_log('suppression de la vignette');
            // Suppression du document
            $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
            if (@file_exists($f = get_spip_doc($vignette))) {
                spip_log("efface {$f}");
                supprimer_fichier($f);
            }
            sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
            sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
            pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
            $id_vignette = 0;
        }
        $arg = $data['vignette'];
        check_upload_error($arg['error']);
        // Ajout du document comme vignette
        /**
         * Méthode >= SPIP 3.0 
         * ou SPIP 2.x + Mediatheque
         */
        if ($ajouter_documents = charger_fonction('ajouter_documents', 'action', true)) {
            $x = $ajouter_documents(null, array($arg), '', 0, 'vignette');
            $vignette = reset($x);
            if (intval($vignette)) {
                document_modifier($id, array('id_vignette' => $vignette));
            } else {
                if ($id_vignette) {
                    document_modifier($id, array('id_vignette' => $id_vignette));
                }
            }
        } else {
            if ($ajouter_documents = charger_fonction('ajouter_documents', 'inc', true)) {
                // On remet l'id_vignette a 0 si on l'a supprimé
                if ($id_vignette) {
                    revision_document($s['id_document'], array('id_vignette' => 0));
                }
                $x = $ajouter_documents($arg['tmp_name'], $arg['name'], '', '', 'vignette', $id, $actifs);
            }
        }
    } else {
        // Suppression de la vignette ?
        if ($wid = array_pop($ref) and $_POST['content_' . $wid . '_vignette_supprimer'] == 'on') {
            if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
                // Suppression du document
                $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
                if (@file_exists($f = get_spip_doc($vignette))) {
                    spip_log("efface {$f}");
                    supprimer_fichier($f);
                }
                sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
                sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
                pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
                // On remet l'id_vignette a 0
                revision_document($s['id_document'], array('id_vignette' => 0));
            }
        }
    }
    return true;
}
Example #6
0
function vignette_revision($id, $data, $type, $ref) {
	$s = sql_fetsel("*","spip_documents","id_document=".intval($id));
	if (!is_array($s))
		return false;

	include_spip('inc/modifier');
	include_spip('inc/documents');
	// Chargement d'un nouveau doc ?
	if ($data['vignette']) {
		define('FILE_UPLOAD', true);
		if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
			spip_log('suppression de la vignette');
			// Suppression du document
			$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
			if (@file_exists($f = get_spip_doc($vignette))) { 
				spip_log("efface $f"); 
				supprimer_fichier($f); 
			}
			sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
			sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));

			pipeline('post_edition',
				array(
					'args' => array(
						'operation' => 'supprimer_document',
						'table' => 'spip_documents',
						'id_objet' => $s['id_vignette']
					),
					'data' => null
				)
			);
			
			// On remet l'id_vignette a 0
			revision_document($s['id_document'], array('id_vignette'=>0));
		}
		// Ajout du document comme vignette
		$ajouter_documents = charger_fonction('ajouter_documents', 'inc');
		$arg = $data['vignette'];
		check_upload_error($arg['error']);
		$x = $ajouter_documents($arg['tmp_name'], $arg['name'],'','', 'vignette', $id, $actifs);
	}else
		// Suppression de la vignette ?
		if ($wid = array_pop($ref)
			AND $_POST['content_'.$wid.'_vignette_supprimer'] == 'on') {
			if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
				// Suppression du document
				$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
				if (@file_exists($f = get_spip_doc($vignette))) { 
					spip_log("efface $f"); 
					supprimer_fichier($f); 
				}
				sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
				sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));
				
				pipeline('post_edition',
					array(
						'args' => array(
							'operation' => 'supprimer_document',
							'table' => 'spip_documents',
							'id_objet' => $s['id_vignette']
						),
						'data' => null
					)
				);
				
				// On remet l'id_vignette a 0
				revision_document($s['id_document'], array('id_vignette'=>0));
			}
		}
	return true;
}
Example #7
0
function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, $id_document, &$documents_actifs, $titrer=false) {

	include_spip('inc/modifier');

// Documents distants : pas trop de verifications bloquantes, mais un test
// via une requete HEAD pour savoir si la ressource existe (non 404), si le
// content-type est connu, et si possible recuperer la taille, voire plus.

	if ($mode == 'distant') {
		include_spip('inc/distant');
		if ($a = recuperer_infos_distantes($source)) {

			# NB: dans les bonnes conditions (fichier autorise et pas trop gros)
			# $a['fichier'] est une copie locale du fichier

			$type_image = $a['type_image'];

			unset($a['type_image']);
			unset($a['body']);

			$a['date'] = date('Y-m-d H:i:s');
			$a['distant'] = 'oui';
			$a['mode'] = 'document';
			$a['fichier'] = set_spip_doc($source);
		}
		else {
			spip_log("Echec du lien vers le document $source, abandon");
			return;
		}
	} else { // pas distant

		$type_image = ''; // au pire
		// tester le type de document :
		// - interdit a l'upload ?
		// - quelle extension dans spip_types_documents ?
		// - est-ce "inclus" comme une image ?
		list($nom_envoye, $ext, $titre, $inclus) = corriger_extension_et_nom($nom_envoye, $titrer);

		if ($inclus !== false) {
			$type_inclus_image = ($inclus == 'image');
			$fichier = copier_document($ext, $nom_envoye, $source);
		} else {

/* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */
			$type_inclus_image = false;

			if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) {
				spip_log("Extension $ext interdite a l'upload");
				return;
			}

			$ext = 'zip';
			if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return;
			spip_unlink($tmp_dir); @mkdir($tmp_dir);
			$tmp = $tmp_dir.'/'.translitteration($nom_envoye);
			$nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
			deplacer_fichier_upload($source, $tmp);
			include_spip('inc/pclzip');
			$source = _DIR_TMP . 'archive.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;
			}
			$fichier = copier_document($ext, $nom_envoye, $source);
			spip_unlink($source);
		}

		// Prevoir traitement specifique pour videos
		// (http://www.getid3.org/ peut-etre
		if ($ext == "mov") {
			$largeur = 0;
			$hauteur = 0;
		} else if ($ext == "svg") {
			// recuperer les dimensions et supprimer les scripts
			list($largeur,$hauteur)= traite_svg($fichier);
		} else { // image ?
		// Si c'est une image, recuperer sa taille et son type (detecte aussi swf)
			$size_image = @getimagesize($fichier);
			$largeur = intval($size_image[0]);
			$hauteur = intval($size_image[1]);
			$type_image = decoder_type_image($size_image[2]);
		}

		// Quelques infos sur le fichier
		if (!$fichier OR !@file_exists($fichier)
		OR !$taille = @intval(filesize($fichier))) {
			spip_log ("Echec copie du fichier $fichier");
			return;
		}
		
		// _INTERFACE_DOCUMENTS
		// Si mode == 'choix', fixer le mode image/document
		if ($mode == 'choix') {
			$choisir_mode_document = charger_fonction('choisir_mode_document','inc');
			$mode = $choisir_mode_document($fichier, $type_lien, $type_image, $largeur, $hauteur);
		}


		if (!$type_image) {
			if (_DOC_MAX_SIZE > 0
			AND $taille > _DOC_MAX_SIZE*1024) {
				spip_unlink ($fichier);
				check_upload_error(6,
				_T('info_logo_max_poids',
					array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024),
					'actuel' => taille_en_octets($taille))));
			}
			if ($mode == 'image') {
				spip_log ("le format de $fichier ne convient pas pour une image");
				spip_unlink($fichier);
				return;
			}
		}
		else { // image
			if (_IMG_MAX_SIZE > 0
			AND $taille > _IMG_MAX_SIZE*1024) {
				spip_unlink ($fichier);
				check_upload_error(6,
				_T('info_logo_max_poids',
					array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024),
					'actuel' => taille_en_octets($taille))));
			}
	
			if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
			AND ($size_image[0] > _IMG_MAX_WIDTH
			OR $size_image[1] > _IMG_MAX_HEIGHT)) {
				spip_unlink ($fichier);
				check_upload_error(6, 
				_T('info_logo_max_taille',
					array(
					'maxi' =>
						_T('info_largeur_vignette',
							array('largeur_vignette' => _IMG_MAX_WIDTH,
							'hauteur_vignette' => _IMG_MAX_HEIGHT)),
					'actuel' =>
						_T('info_largeur_vignette',
							array('largeur_vignette' => $size_image[0],
							'hauteur_vignette' => $size_image[1]))
				)));
			}
		}

		// Si on veut uploader une vignette, il faut qu'elle ait ete bien lue
		if ($mode == 'vignette') {
			if (!$type_inclus_image) {
				spip_log ("le format de $fichier ne convient pas pour une image"); # SVG
				spip_unlink($fichier);
				return;
			}

			if (!($largeur OR $hauteur)) {
				spip_log('erreur upload vignette '.$fichier);
				spip_unlink($fichier);
				return;
			}
		} elseif (!in_array($mode, array('distant', 'image', 'document'))) {
			if ($type_image AND $type_inclus_image)
				$mode = 'image';
			else
				$mode = 'document';
		}
		$a =  array(
			'date' => date('Y-m-d H:i:s'),
			'distant' => 'non',
			'mode' => $mode,
			'titre'=> $titre,
			'largeur' => $largeur,
			'hauteur' => $hauteur,
			'taille' => $taille,
			'extension'=> $ext, 
			'fichier' => set_spip_doc($fichier));
	}

	if (($id_document=intval($id_document)) AND $mode!='vignette') {

		 // Mise a jour des descripteurs d'un vieux doc
		unset($a['titre']);
		unset($a['date']);
		unset($a['distant']);
		unset($a['mode']);

		sql_updateq('spip_documents', $a, "id_document=$id_document");
		$id = $id_document;

	} else {
	// Installer le document dans la base
	// attention piege semantique : les images s'installent en mode 'vignette'
	// note : la fonction peut "mettre a jour un document" si on lui
	// passe "mode=document" et "id_document=.." (pas utilise)

		// Envoyer aux plugins
		$a = pipeline('pre_insertion',
			array(
				'args' => array(
					'table' => 'spip_documents',
				),
				'data' => $a
			)
		);

		if (strlen($a['fichier']) > 255) {
			spip_log("Upload avec nom > 255 : " . $a['fichier']);
			return;
		}
		$id = sql_insertq("spip_documents", $a);

		pipeline('post_insertion',
			array(
				'args' => array(
					'table' => 'spip_documents',
					'id_objet' => $id_document
				),
				'data' => $a
			)
		);

		spip_log ("ajout du document $source $nom_envoye  (M '$mode' T '$type_lien' L '$id_lien' D '$id')");

		if ($id_lien AND $id
		AND preg_match('/^[a-z0-9_]+$/i', $type_lien) # securite
		) {
			sql_insertq('spip_documents_liens',
				    array('id_document' => $id,
					  'id_objet' => $id_lien,
					  'objet' => $type_lien));
		} else spip_log("Pb d'insertion $id_lien $type_lien");

		if ($id_document) {
			sql_updateq("spip_documents", array("id_vignette" => $id, "mode" => 'document'), "id_document=$id_document");

		} else  $id_document = $id;


		// Appliquer l'exif orientation
		// http://trac.rezo.net/trac/spip/ticket/1494
		define('_TOURNER_SELON_EXIF', false); # par defaut non, risque memoire
		if (defined('_TOURNER_SELON_EXIF')
		AND _TOURNER_SELON_EXIF
		AND $mode == 'document'
		AND $a['distant'] == 'non'
		AND $a['extension'] == 'jpg') {
			include_spip('action/tourner');
			tourner_selon_exif_orientation($id_document, $fichier);
		}

	}
	// pour que le retour vers ecrire/ active le bon doc.
	$documents_actifs[$fichier] = $id_document;
	// Notifications, gestion des revisions, reindexation...
	pipeline('post_edition',
		array(
			'args' => array(
				'operation' => 'ajouter_document',
				'table' => 'spip_documents',
				'id_objet' => $id,
				'type_image' => $type_image
			),
			'data' => null
		)
	);

	return $id ;
}