préserver le type mime d'un fichier uploadé via l'admin generator de symfony

L’ admin-generator gère l’upload de fichier. Pour l’objet sfCmsContent d’accordéon CMS par exemple, l’attribut file_path est déclaré comme suit dans le generator.yml

file_path:
  name: fichier
  type: admin_input_file_tag
  upload_dir: sfCmsContent/file
  params: disabled=false include_remove=true
  help: appuyer sur le bouton 'Parcourir...' pour sélectionner un fichier contenu dans votre ordinateur

Cela permet d’avoir un formulaire d’upload avec une checkbox pour la suppression du fichier. Si le fichier est nouveau un nom aléatoire lui sera attribué, sinon il remplacera l’ancienne version du fichier et ce sans écrire une ligne de code.
Les problèmes pointent leur nez quand on tente d’uploader des fichiers avec des extensions un peu exotiques, dans mon cas l’extension .pot (modèle de conception sous power point) était systématiquement remplacée par l’extension .ppt.
C’est dû à la méthode getFileExtension() de sfWebRequest, et en particulier au fichier mime_types.dat qui contient les associations entre type mime et extension. La difficulté dans le cas des .pot est que ce type de fichier renvoie le même type mime que les .ppt

application/vnd.ms-powerpoint

Or mime_types.dat permet d’associer un et un seul type mime à une et une seule extension … j’ai donc opté pour la ruse en surchargeant updateSfCmsContentFromRequest() comme suit

protected function updateSfCmsContentFromRequest()
{
  $sfCmsContent = $this->getRequestParameter('sf_cms_content');
  parent::updateSfCmsContentFromRequest();
  if (!$this->getRequest()->hasErrors())
  {
    $tmp = $this->getRequest()->getFileName('sf_cms_content');
    if($tmp['file_path'])
    {
      $path = sfConfig::get('sf_upload_dir').'/'.sfCmsContent/file
      if(!is_dir($path))
      {
        mkdir($path);
      }

      $extension = myTools::MimeTypeInfo($tmp['file_path']);
      $filename  = myTools::FileNameInfo($this->sf_cms_content->getFilePath());
      rename($path.'/'.$this->sf_cms_content->getFilePath(), $path.'/'.$filename.'.'.$extension);
      $this->sf_cms_content->setFilePath($filename.'.'.$extension);
      $this->sf_cms_content->setMimeType(myTools::MimeTypeInfo($tmp['file_path']));
    }
  }
}

class myTools
{
  public static function MimeTypeInfo($file_name)
  {
    return substr($file_name, strrpos($file_name, ".")+1);
  }
  public static function FileNameInfo($file_name)
  {
    return substr($file_name, 0, strrpos($file_name, "."));
  }
}

on se sert ainsi de l’extension du fichier pour déterminer son type mime, et on est assuré que cette extension est préservée

partager cet article
  • Facebook
  • Twitter
  • del.icio.us
  • Google Bookmarks
  • Digg
  • Technorati
  • Wikio FR
  • Yahoo! Buzz
  • Netvibes
  • Ping.fm
  • HelloTxt
  • MySpace
  • Tumblr
  • FriendFeed
  • LinkedIn
  • viadeo FR
  • email
  • PDF
Posted by: mazenovi on 11 avril 2008 @ 8 h 27 min
Filed under: dev

Pas de commentaire »

Pas encore de commentaire.

Flux RSS des commentaires de cet article. TrackBack URL

Laisser un commentaire