@ -23,15 +23,13 @@ if (!empty($_FILES)) {
$files = $_FILES["Filedata"];
$ajouter_documents = charger_fonction('ajouter_documents', 'action');
$mode = joindre_determiner_mode($mode,$id_document,$objet);
include_spip('inc/joindre_document');
$nouveaux_doc = ajouter_un_doc($id_document,$files,$objet,$id_objet,$mode);
$mode = joindre_determiner_mode($mode,$id_document,$objet);
$ajouter_un_document = charger_fonction('ajouter_un_document','action');
$nouveaux_doc = $ajouter_un_document($id_document, $files, $objet, $id_objet, $mode);
if (defined('_tmp_dir'))
effacer_repertoire_temporaire(_tmp_dir);
// Ligne echo obligatoire pour le script Uploadify : c'est sa détection de bonne fin
// echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);
@ -41,8 +39,7 @@ if (!empty($_FILES)) {
return $nouveaux_doc;
}
// Les fonctions
// Copie/Conforme de medias/formulaires/joindre_document.php TODO => ne pourrait-on pas l'inclure directement ??
function joindre_determiner_mode($mode,$id_document,$objet){
if ($mode=='auto'){
if (intval($id_document))
@ -54,158 +51,4 @@ function joindre_determiner_mode($mode,$id_document,$objet){
}
}
return $mode;
}
function ajouter_un_doc($id_document, $file, $objet, $id_objet, $mode) {
$source = $file['tmp_name'];
$nom_envoye = $file['name'];
// passer en minuscules le nom du fichier, pour eviter les collisions
// si le file system fait la difference entre les deux il ne detectera
// pas que Toto.pdf et toto.pdf
// et on aura une collision en cas de changement de file system
$file['name'] = strtolower(translitteration($file['name']));
// Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut
if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); }
$titrer = isset($file['titrer'])?$file['titrer']:_TITRER_DOCUMENTS;
$mode = ((isset($file['mode']) AND $file['mode'])?$file['mode']:$mode);
include_spip('inc/modifier');
if (isset($file['distant']) AND $file['distant'] AND !in_array($mode,array('choix','auto','image','document'))) {
include_spip('inc/distant');
$file['tmp_name'] = _DIR_RACINE . copie_locale($source);
$source = $file['tmp_name'];
unset($file['distant']);
}
// 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 (isset($file['distant']) AND $file['distant']) {
include_spip('inc/distant');
if (is_array($a = renseigner_source_distante($source))) {
$champs = $a;
# NB: dans les bonnes conditions (fichier autorise et pas trop gros)
# $a['fichier'] est une copie locale du fichier
unset($champs['type_image']);
}
// on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie !
else {
spip_log("Echec du lien vers le document $source, abandon");
return $a; // message d'erreur
}
}
else { // pas distant
$champs = array(
'distant' => 'non'
);
$type_image = ''; // au pire
$champs['titre'] = '';
if ($titrer){
$titre = substr($nom_envoye,0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier
$titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
}
if (!is_array($fichier = fixer_fichier_upload($file, $mode)))
return is_string($fichier)?$fichier:_T("medias:erreur_upload_type_interdit",array('nom'=>$file['name']));
$champs['inclus'] = $fichier['inclus'];
$champs['extension'] = $fichier['extension'];
$champs['fichier'] = $fichier['fichier'];
/**
* Récupère les informations du fichier
* -* largeur
* -* hauteur
* -* type_image
* -* taille
* -* ses metadonnées si une fonction de metadatas/ est présente
*/
$infos = renseigner_taille_dimension_image($champs['fichier'],$champs['extension']);
if (is_string($infos))
return $infos; // c'est un message d'erreur !
$champs = array_merge($champs,$infos);
// Si mode == 'choix', fixer le mode image/document
if (in_array($mode,array('choix','auto'))) {
$choisir_mode_document = charger_fonction('choisir_mode_document','inc');
$mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet);
}
$champs['mode'] = $mode;
// if (($test = verifier_taille_document_acceptable($champs))!==true){
// spip_unlink($champs['fichier']);
// return $test; // erreur sur les dimensions du fichier
// }
unset($champs['type_image']);
unset($champs['inclus']);
$champs['fichier'] = set_spip_doc($champs['fichier']);
}
// si le media est pas renseigne, le faire, en fonction de l'extension
if (!isset($champs['media'])){
$champs['media'] = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($champs['extension']));
}
// lier le parent si necessaire
if ($id_objet=intval($id_objet) AND $objet)
$champs['parents'][] = "$objet|$id_objet";
// "mettre a jour un document" si on lui
// passe un id_document
if ($id_document=intval($id_document)){
unset($champs['titre']); // garder le titre d'origine
unset($champs['date']); // garder la date d'origine
unset($champs['descriptif']); // garder la desc d'origine
// unset($a['distant']); # on peut remplacer un doc statique par un doc distant
// unset($a['mode']); # on peut remplacer une image par un document ?
}
include_spip('action/editer_document');
// Installer le document dans la base
if (!$id_document){
if ($id_document = document_inserer())
spip_log ("ajout du document ".$file['tmp_name']." ".$file['name']." (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias');
else
spip_log ("Echec insert_document() du document ".$file['tmp_name']." ".$file['name']." (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias'._LOG_ERREUR);
}
if (!$id_document)
return _T('medias:erreur_insertion_document_base',array('fichier'=>"< em > ".$file['name']."< / em > "));
document_modifier($id_document,$champs);
// permettre aux plugins de faire des modifs a l'ajout initial
// ex EXIF qui tourne les images si necessaire
// Ce plugin ferait quand même mieux de se placer dans metadata/jpg.php
pipeline('post_edition',
array(
'args' => array(
'table' => 'spip_documents', // compatibilite
'table_objet' => 'documents',
'spip_table_objet' => 'spip_documents',
'type' =>'document',
'id_objet' => $id_document,
'champs' => array_keys($champs),
'serveur' => '', // serveur par defaut, on ne sait pas faire mieux pour le moment
'action' => 'ajouter_document',
'operation' => 'ajouter_document', // compat < = v2.0
),
'data' => $champs
)
);
return $id_document ;
}
?>
}