2013-03-21 47 views
1

我想知道如何在不使用收集字段類型的情況下創建多個文件上傳。事情是:我有一個班,我需要鏈接圖片。我不需要這些圖像中的任何描述和其他類型的信息,所以我只是在主實體中創建了額外的字段。然後,添加使用Symfony2上傳和刪除多個文件

->add('files', 'file', array(
     'label' => 'Images', 
     'required' => false, 
     'attr' => array(
      'accept' => 'image/*', 
      'multiple' => true 
     ) 

的窗體類和這樣的:

/** 
* @ORM\PrePersist() 
* @ORM\PreUpdate() 
*/ 
public function preUpload() 
{ 
    if (!empty($this->files)) { 
     if (!empty($this->images)) { 
      $this->insertingKey = $this->images->count(); 
     } 
     foreach ($this->files as $file) { 
      $imageName = uniqid('entity_') . '_' . date('Y-m-d_H:i') . '.' . $file->guessExtension(); 
      if ($this->images === null) { 
       $this->images = new ArrayCollection(); 
      } 
      $this->images->add($imageName); 
     } 
    } 
} 

/** 
* @ORM\PostPersist() 
* @ORM\PostUpdate() 
*/ 
public function upload() 
{ 
    if (empty($this->files)) { 
     return; 
    } 

    if ($this->insertingKey) { 
     foreach ($this->files as $file) { 
      $file->move($this->getUploadRootDir(), $this->images[ $this->insertingKey++ ]); 
     } 
    } else { 
     foreach ($this->files as $key => $file) { 
      $file->move($this->getUploadRootDir(), $this->images[ $key ]); 
     } 
    } 
} 

的學說事件在我的實體類,當然我做喜歡和數組文件歸檔工作。 但我的問題是 - 我無法第二次添加圖像。例如,當我已經上傳了一些圖片並決定上傳更多圖片時,他們會實際上傳圖片(我可以在我的項目目錄中看到它們),但是我的網頁上沒有任何更改。

你能給我些建議嗎?或者,也許還有其他方法通過上傳許多文件並同時只有一個表單域?萬分感謝。

回答

1

我這種方式解決了這個問題:

這是從我的實體代碼

/** 
* @ORM\PrePersist() 
* @ORM\PreUpdate() 
*/ 
public function preUpload() 
{ 
    if ($this->files[0] != null || !$this->files) { 
     if (!empty($this->images)) { 
      $this->insertingKey = count($this->images); 
     } 
     foreach ($this->files as $file) { 
      $imageName = uniqid('pref_') . '_' . date('Y-m-d_H:i') . '.' . $file->guessExtension(); 
      if ($this->images === null) { 
       $this->images = array(); 
      } 
      $this->images[] = $imageName; 
     } 
    } 
} 

/** 
* @ORM\PostPersist() 
* @ORM\PostUpdate() 
*/ 
public function upload() 
{ 
    if ($this->files[0] == null || !$this->files) { 
     return; 
    } 

    if ($this->insertingKey) { 
     foreach ($this->files as $file) { 
      $file->move($this->getUploadRootDir(), $this->images[ $this->insertingKey++ ]); 
     } 
    } else { 
     foreach ($this->files as $key => $file) { 
      $file->move($this->getUploadRootDir(), $this->images[ $key ]); 
     } 
    } 
} 

public function getImagesWithAbsolutePath() 
{ 
    if (!empty($this->images)) { 
     $images = array(); 
     foreach ($this->images as $image) { 
      $images[$image] = $this->getUploadRootDir() . '/' . $image; 
     } 

     return $images; 
    } 

    return null; 
} 

public function getImagesWithRelativePath() 
{ 
    if (!empty($this->images)) { 
     $images = array(); 
     foreach ($this->images as $image) { 
      $images[$image] = $this->getUploadDir() . '/' . $image; 
     } 

     return $images; 
    } 

    return null; 
} 

public function getUploadRootDir() 
{ 
    return __DIR__ . '/../../../../web/' . $this->getUploadDir(); 
} 

public function getUploadDir() 
{ 
    return 'images/venue'; 
} 

public function removeImage($imageName) 
{ 
    if ($this->images && in_array($imageName, $this->images)) { 
     $key = array_search($imageName, $this->images); 
     unset($this->images[$key]); 
     if (file_exists($this->getUploadRootDir() . '/' . $imageName)) { 
      unlink($this->getUploadRootDir() . '/' . $imageName); 
     } 

     $this->images = array_values($this->images); 
    } 
} 

這是從控制器的一段代碼:

if ($request->getMethod() === "POST") { 
     $form->bind($request); 
     if ($form->isValid()) { 
      $deleteImages = $request->request->get('delete_thumb', array()); 
      if (!empty($deleteImages)) { 
       foreach ($request->request->get('delete_thumb') as $image) { 
        $imageName = substr($image, strrpos($image, '/') + 1); 
        $venue->removeImage($imageName); 
       } 
      } 
      $this->persist($venue, true); 
      if ($request->request->get('submit-and-quit') !== null) { 
       return $this->redirectToRoute('admin_list'); 
      } 

      return array('form' => $form->createView()); 
     } 
    }