2013-08-21 1 views
2

J'utilise la bibliothèque de téléchargement intégrée de Codeigniter. Ce sont mes paramètres de téléchargement:Codeigniter upload ajoutant un trait de soulignement au nom de fichier

$config['upload_path'] = upload_path() . 'incoming_faxes/'; 
$config['allowed_types'] = 'xml|pdf'; 
$config['file_name'] = uniqid('fax-' . time() . '-', true) . '.xml'; 
$this->load->library('upload', $config); 

Cela fonctionne. Les données renvoyées est au-dessous, mais le file_name a un trait de soulignement en annexe:

Array 
(
    [file_name] => fax-1377114300-521518bca7c5a7.65243756_.xml 
    [file_type] => application/xml 
    [file_path] => /var/www/vhosts/example.org/httpdocs/uploads/incoming_faxes/ 
    [full_path] => /var/www/vhosts/example.org/httpdocs/uploads/incoming_faxes/fax-1377114300-521518bca7c5a7.65243756_.xml 
    [raw_name] => fax-1377114300-521518bca7c5a7.65243756_ 
    [orig_name] => fax-1377114300-521518bca7c5a7.65243756_.xml 
    [client_name] => Sample.xml 
    [file_ext] => .xml 
    [file_size] => 84.69 
    [is_image] => 
    [image_width] => 
    [image_height] => 
    [image_type] => 
    [image_size_str] => 
) 

Comment puis-je supprimer le trait de soulignement avant que le fichier est téléchargé sur le serveur?

+1

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. –

+0

@ Fred-ii- bonne idée, n'a pas fonctionné cependant. – doitlikejustin

+0

Jetez un oeil à cette réponse sur SO http://stackoverflow.com/a/4074238/1415724 –

Répondre

3
$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.

+0

Je veux le faire AVANT qu'il ne soit téléchargé. Si je 'echo $ config ['file_name']' il n'y a pas de point OU de soulignement à la fin. Et avec votre explication, vous dites qu'il se sépare du dernier nombre, voulez-vous dire qu'il supprime littéralement le dernier nombre et le remplace par un point? – doitlikejustin

+0

Eh bien, vous définissez '$ config' avant de télécharger. Donc, définissez $ filename avant config et définissez '$ config ['nom_fichier'] = $ filename;' – stormdrain

+0

Non, il ne supprime pas le dernier numéro et le remplace par un trait de soulignement ... J'ai mis à jour la réponse pour clarifier ce qui se passe. – stormdrain

Questions connexes