2016-05-21 2 views
0

Я использую PHP (Symfony2) в своем проекте, который имеет функцию загрузки изображений. Внутри контроллера:Загрузка файла PHP создает имена файлов, начинающиеся с «PHP» и с расширением .tmp

if ($request->isXmlHttpRequest() && $request->isMethod('POST')) { 
    $index=(int)$request->request->get('index'); 

    $image_file = $request->files->get('shop_bundle_managementbundle_posttype')['images'][$index]['file']; 

    $image= new Image(); 

    $image->setFile($image_file); 
    $image->setSubDir('hg'); 
    $image->upload(); 
    $em->persist($image); 
    $em->flush(); 
} 

Я использую класс UploadFileMover, которые обрабатывают загрузку файла. Я не написал следующий код, но, как я понимаю, хеш MD5 будет создан из исходного имени файла и использоваться как имя файла. Но экземпляр UploadedFile содержит имя файла, например «PHP» + number.tmp, а не оригинал, хранящийся в компьютерной файловой системе.

класс UploadFileMover {

public function moveUploadedFile(UploadedFile $file, $uploadBasePath,$relativePath) 
    { 
     $originalName = $file->getFilename(); 

     $targetFileName = $relativePath . DIRECTORY_SEPARATOR . $originalName; 

     $targetFilePath = $uploadBasePath . DIRECTORY_SEPARATOR . $targetFileName; 

     $ext = $file->getExtension(); 

     $i=1; 
     while (file_exists($targetFilePath) && md5_file($file->getPath()) != md5_file($targetFilePath)) { 
      if ($ext) { 
       $prev = $i == 1 ? "" : $i; 
       $targetFilePath = $targetFilePath . str_replace($prev . $ext, $i++ . $ext, $targetFilePath); 

      } else { 
       $targetFilePath = $targetFilePath . $i++; 
      } 
     } 

     $targetDir = $uploadBasePath . DIRECTORY_SEPARATOR . $relativePath; 

     if (!is_dir($targetDir)) { 
     $ret = mkdir($targetDir, umask(), true); 
     if (!$ret) { 
     throw new \RuntimeException("Could not create target directory to move temporary file into."); 
     } 
     } 
     $file->move($targetDir, basename($targetFilePath)); 

     return str_replace($uploadBasePath . DIRECTORY_SEPARATOR, "", $targetFilePath); 
} 

} 

Этот класс инстанциирован когда изображение загружается. Другими словами, у меня есть Entity Image, который имеет метод upload. Внутри класс объекта:

public function upload() 
{ 
    if (null === $this->getFile()) { 
     return; 
    } 

    $uploadFileMover = new UploadFileMover(); 
    $this->path = $uploadFileMover->moveUploadedFile($this->file, self::getUploadDir(),$this->subDir); 

    $this->file = null; 
} 

Я var_dumped имени файла все через различные шаги, но я не могу понять, где он превращается в PHP16653.tmp.

Может быть, это связано с конфигурацией, связанной с APACHE? Ваша помощь приветствуется. Я действительно много исследовал аналогичную проблему в Интернете, но безрезультатно.

ответ

0

Проблема была создана линия:

$originalName = $file->getFilename(); 

Использование:

$originalName = $file->getClientOriginalName(); 

вместо этого.

Смежные вопросы