$fn = uniqid('fax-' . time() . '-', true);
$filename = preg_replace('/\./','_', $fn) . '.xml';
devrait le faire.
Test:
$parts = explode('.', $filename);
$ext = array_pop($parts);
$filename = array_shift($parts);
foreach ($parts as $part)
{
if (1==1)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
$filename .= '.'.$ext;
echo $filename;//fax-1377117024-52152360903ae2_02709878.xml
Il ressemble à ce qui se passe est la méthode _prep_filename()
dans upload.php vérifie la allowed_types
et mimes_types
contre le nom du fichier a explosé. La période dans votre nom de fichier sépare le dernier numéro avant l'extension (65243756 dans votre exemple de nom de fichier) dans le tableau parts
. Il vérifie ensuite cette valeur par rapport à allowed_types
et mimes_types
. Impossible de trouver le numéro dans allowed_types
ni dans mimes_types
, il ajoute le trait de soulignement.
C'est une question étrange. Voir ici pour plus d'informations: https://github.com/EllisLab/CodeIgniter/issues/1380
Décomposant:
// system/core/libraries/Upload.php
// line 984
protected function _prep_filename($filename)
{
if (strpos($filename, '.') === FALSE OR $this->allowed_types == '*')
{
return $filename;
}
$parts = explode('.', $filename);
$ext = array_pop($parts);
$filename = array_shift($parts);
foreach ($parts as $part)
{
if (! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
$filename .= '.'.$ext;
return $filename;
}
Étant donné le nom du fichier fax-1377114300-521518bca7c5a7.65243756.xml
, c'est ce qui se passe.
$parts = explode('.', $filename);
ce casse $filename
dans un tableau contenant 3 valeurs:
print_r($parts); //Array ([0] => fax-1377119574-52152d561f4694 [1] => 21065888 [2] => xml)
ligne suivante ...
$ext = array_pop($parts);
pop
du tableau $parts
:
print_r($parts); //Array ([0] => fax-1377119706-52152dda0205e5 [1] => 29551151)
ligne suivante ...
$filename = array_shift($parts);
shift
du tableau:
print_r($parts); //Array ([0] => 39795691)
de sorte que maintenant $parts
ne contient qu'un seul élément: 39795691
.
Maintenant, il fonctionne
foreach ($parts as $part)
{
if (! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
qui vérifie si l'une des valeurs $parts
(rappelez-vous, dans ce cas, nous avons seulement un élément: 39795691
) se trouve dans les tableaux allowed_types
ou mime_types
. Comme il s'agit d'un nombre et qu'il ne se trouve dans aucun de ces tableaux, il concatène la partie dans la variable $filename
et ajoute le trait de soulignement.
Essayez d'ajouter ''remove_spaces' => FALSE' à votre tableau de configuration et voyez si cela résout le problème. Ceci est défini sur TRUE par défaut, mais il ne doit remplacer les espaces que par des underscores. Ce pourrait être un bug de CI avec la classe de téléchargement de fichier. –
@ Fred-ii- bonne idée, n'a pas fonctionné cependant. – doitlikejustin
Jetez un oeil à cette réponse sur SO http://stackoverflow.com/a/4074238/1415724 –