3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
16 * donne le chemin du fichier relatif a _DIR_IMG
17 * pour stockage 'tel quel' dans la base de donnees
19 * http://doc.spip.org/@set_spip_doc
21 * @param string $fichier
24 function set_spip_doc($fichier) {
25 if (strpos($fichier, _DIR_IMG
) === 0)
26 return substr($fichier, strlen(_DIR_IMG
));
28 return $fichier; // ex: fichier distant
32 * donne le chemin complet du fichier
34 * http://doc.spip.org/@get_spip_doc
36 * @param string $fichier
39 function get_spip_doc($fichier) {
41 if (preg_match(',^\w+://,', $fichier))
44 // gestion d'erreurs, fichier=''
45 if (!strlen($fichier))
49 strncmp($fichier,_DIR_IMG
, strlen(_DIR_IMG
))!=0
61 * http://doc.spip.org/@creer_repertoire_documents
66 function creer_repertoire_documents($ext) {
67 $rep = sous_repertoire(_DIR_IMG
, $ext);
70 spip_log("creer_repertoire_documents '$rep' interdit");
74 // Cette variable de configuration peut etre posee par un plugin
75 // par exemple acces_restreint
76 if (isset($GLOBALS['meta']["creer_htaccess"]) AND $GLOBALS['meta']["creer_htaccess"] == 'oui') {
77 include_spip('inc/acces');
78 verifier_htaccess($rep);
85 * Efface le repertoire de maniere recursive !
87 * http://doc.spip.org/@effacer_repertoire_temporaire
91 function effacer_repertoire_temporaire($nom) {
93 while (($f = readdir($d)) !== false) {
94 if (is_file("$nom/$f"))
95 spip_unlink("$nom/$f");
96 else if ($f <> '.' AND $f <> '..'
97 AND is_dir("$nom/$f"))
98 effacer_repertoire_temporaire("$nom/$f");
106 * Copier un document $source un dossier IMG/$ext/$orig.$ext
107 * en numerotant eventuellement si un du meme nom existe deja
109 * http://doc.spip.org/@copier_document
112 * @param string $orig
113 * @param string $source
114 * @return bool|mixed|string
116 function copier_document($ext, $orig, $source) {
118 $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
119 $dir = creer_repertoire_documents($ext);
120 $dest = preg_replace("/[^.=\w-]+/", "_",
121 translitteration(preg_replace("/\.([^.]+)$/", "",
122 preg_replace("/<[^>]*>/", '', basename($orig)))));
124 // ne pas accepter de noms de la forme -r90.jpg qui sont reserves
125 // pour les images transformees par rotation (action/documenter)
126 $dest = preg_replace(',-r(90|180|270)$,', '', $dest);
128 // Si le document "source" est deja au bon endroit, ne rien faire
129 if ($source == ($dir . $dest . '.' . $ext))
132 // sinon tourner jusqu'a trouver un numero correct
134 while (@file_exists
($newFile = $dir . $dest .($n++ ?
('-'.$n) : '').'.'.$ext));
136 return deplacer_fichier_upload($source, $newFile);
140 * Trouver le dossier utilise pour upload un fichier
142 * http://doc.spip.org/@determine_upload
144 * @param string $type
145 * @return bool|string
147 function determine_upload($type='') {
148 if(!function_exists('autoriser'))
149 include_spip('inc/autoriser');
151 if (!autoriser('chargerftp')
152 OR $type == 'logos') # on ne le permet pas pour les logos
155 $repertoire = _DIR_TRANSFERT
;
156 if (!@is_dir
($repertoire)) {
157 $repertoire = str_replace(_DIR_TMP
, '', $repertoire);
158 $repertoire = sous_repertoire(_DIR_TMP
, $repertoire);
161 if (!$GLOBALS['visiteur_session']['restreint'])
164 return sous_repertoire($repertoire, $GLOBALS['visiteur_session']['login']);
168 * Deplacer ou copier un fichier
170 * http://doc.spip.org/@deplacer_fichier_upload
172 * @param string $source
173 * @param string $dest
175 * @return bool|mixed|string
177 function deplacer_fichier_upload($source, $dest, $move=false) {
179 if (substr($dest,0,strlen(_DIR_RACINE
))==_DIR_RACINE
)
180 $dest = _DIR_RACINE
.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE
)));
182 $dest = preg_replace(',\.\.+,', '.', $dest);
184 if ($move) $ok = @rename
($source, $dest);
185 else $ok = @copy
($source, $dest);
186 if (!$ok) $ok = @move_uploaded_file
($source, $dest);
188 @chmod
($dest, _SPIP_CHMOD
& ~
0111);
190 $f = @fopen
($dest,'w');
194 include_spip('inc/flock');
195 raler_fichier($dest);
199 return $ok ?
$dest : false;
204 // renvoie false si pas d'erreur
205 // et true si erreur = pas de fichier
206 // pour les autres erreurs affiche le message d'erreur et meurt
207 // http://doc.spip.org/@check_upload_error
208 function check_upload_error($error, $msg='', $return=false) {
209 global $spip_lang_right;
211 if (!$error) return false;
213 spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php");
217 case 4: /* UPLOAD_ERR_NO_FILE */
220 # on peut affiner les differents messages d'erreur
221 case 1: /* UPLOAD_ERR_INI_SIZE */
222 $msg = _T('upload_limit',
223 array('max' => ini_get('upload_max_filesize')));
225 case 2: /* UPLOAD_ERR_FORM_SIZE */
226 $msg = _T('upload_limit',
227 array('max' => ini_get('upload_max_filesize')));
229 case 3: /* UPLOAD_ERR_PARTIAL */
230 $msg = _T('upload_limit',
231 array('max' => ini_get('upload_max_filesize')));
236 $msg = _T('pass_erreur').' '. $error
237 . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]");
241 spip_log ("erreur upload $error");
245 if(_request("iframe")=="iframe") {
246 echo "<div class='upload_answer upload_error'>$msg</div>";
250 include_spip('inc/minipres');
252 "<div style='text-align: $spip_lang_right'><a href='" . rawurldecode($GLOBALS['redirect']) . "'><button type='button'>" . _T('ecrire:bouton_suivant') . "</button></a></div>");