2017-01-13 2 views
-1

Я новичок в PHP. Мне удалось загрузить одно изображение в форму и сохранить ее в базе данных. Но когда я изменить что для загрузки нескольких изображений, я получаю сообщение об ошибке сказавКак получить uploadedFile массив из формы PHP

вид Данные формы, как ожидается, будет экземпляром класса Symfony \ Component \ HttpFoundation \ File \ File, но это (п) массив ,

class SatelliteImages 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 



/** 
* @var array 
*/ 
    private $files= array(); 


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    *Set files 
    * 
    * @param UploadedFile[] $files 
    */ 
    public function setFiles($files) 
    { 
     $this->files = $files; 

     //return $this; 
    } 

    /** 
    * Get files 
    * 
    * @return UploadedFile[] 
    */ 
    public function getFiles() 
    { 
     return $this->files; 
    } 

    /** 
    * @param satelliteImage[] $images 
    * 
    * @return satelliteImage[] 
    * 
    */ 
    public function upload($images){ 
     foreach ($this->getFiles() as $key => $file) { 
      $images[$key]->setImage(file_get_contents($file)); 
     } 
     return $images; 
    } 
} 

Это SatelliteImage объект (одно изображение)

class satelliteImage 
    { 
     /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @var float 
     * 
     * @ORM\Column(name="latitude", type="float") 
     */ 
     private $latitude; 

     /** 
     * @var float 
     * 
     * @ORM\Column(name="longitude", type="float") 
     */ 
     private $longitude; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="image", type="blob", nullable=true)) 
     */ 
     private $image; 

     /** 
     * @ORM\Column(type="string", length=255, nullable=true) 
     */ 
     public $path; 


     /** 
     * Get id 
     * 
     * @return int 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * Set latitude 
     * 
     * @param float $latitude 
     * 
     * @return satelliteImage 
     */ 
     public function setLatitude($latitude) 
     { 
      $this->latitude = $latitude; 

      return $this; 
     } 

     /** 
     * Get latitude 
     * 
     * @return float 
     */ 
     public function getLatitude() 
     { 
      return $this->latitude; 
     } 

     /** 
     * Set longitude 
     * 
     * @param float $longitude 
     * 
     * @return satelliteImage 
     */ 
     public function setLongitude($longitude) 
     { 
      $this->longitude = $longitude; 

      return $this; 
     } 

     /** 
     * Get longitude 
     * 
     * @return float 
     */ 
     public function getLongitude() 
     { 
      return $this->longitude; 
     } 

     /** 
     * Set image 
     * 
     * @param string $image 
     * 
     * @return satelliteImage 
     */ 
     public function setImage($image) 
     { 
      $this->image = $image; 

      return $this; 
     } 

     /** 
     * Get image 
     * 
     * @return string 
     */ 
     public function getImage() 
     { 
      return $this->image; 
     } 

     /** 
     * Get path 
     * 
     * @return string 
     */ 
     public function getPath() 
     { 
      return $this->path; 
     } 


     public function getAbsolutePath() 
     { 
      return null === $this->path 
       ? null 
       : $this->getUploadRootDir().'/'.$this->path; 
     } 

     public function getWebPath() 
     { 
      return null === $this->path 
       ? null 
       : $this->getUploadDir().'/'.$this->path; 
     } 

     protected function getUploadRootDir() 
     { 
      // the absolute directory path where uploaded 
      // documents should be saved 
      return __DIR__.'/../../../../web/'.$this->getUploadDir(); 
     } 

     protected function getUploadDir() 
     { 
      // get rid of the __DIR__ so it doesn't screw up 
      // when displaying uploaded doc/image in the view. 
      return 'uploads/documents'; 
     } 

     /** 
     * @Assert\File(maxSize="6000000") 
     */ 
     private $file; 

     /** 
     * Sets file. 
     * 
     * @param UploadedFile $file 
     */ 
     public function setFile(UploadedFile $file = null) 
     { 
      $this->file = $file; 
     } 

     /** 
     * Get file. 
     * 
     * @return UploadedFile 
     */ 
     public function getFile() 
     { 
      return $this->file; 
     } 


     public function upload() 
     { 
     // the file property can be empty if the field is not required 
     if (null === $this->getFile()) { 
      return; 
     } 

     $imgFile=$this->getFile(); 
     $this->setImage(file_get_contents($imgFile)); 

     // clean up the file property as you won't need it anymore 
     $this->file = null; 
     } 
    } 

В мой контроллер, как я могу создать массив изображений и передать его функции выше?

/** 
    * @Route("/uploads", name="upload_images") 
    * 
    */ 
    public function uploadImages(Request $request) 
    { 
     $images=new Images(); 

     $form = $this->createForm(ImageFile::class, $images); 
     $form->handleRequest($request); 

     $em=$this->getDoctrine()->getManager(); 
     $images->upload(????); 
    } 

ImageFile класс:

class ImageFile extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('files', FileType::class, array(
       'attr' => array(
        'accept' => 'image/*', 
        'multiple' => 'multiple' 
       ) 
      )) 
      ->add('save',SubmitType::class,array('label'=>'Insert Image','attr'=>array('class'=>'btn btn-primary','style'=>'margin-bottom:15px'))) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => SatelliteImages::class 
     )); 
    } 
} 
+0

@ ShiraNai7, извините, но он даже не удаленно закрыт. Я все еще думаю о перспективе Java-массива. Я не знаю, возможно ли создание массива сущностей даже в PHP.Если это так, как я могу выполнить свою задачу? –

+1

Привет там Мадхука. Для чего используется форма вашего изображения? Является ли цель формы размещать несколько изображений, а затем загружать их. Это хороший вопрос - я не знаю, почему люди проголосовали за закрытие. Возможно, было бы полезно показать больше вашего кода формы, если вы используете его для загрузки изображений. –

+0

@AlvinBunk, да, это точно мое намерение. Но когда я отправляю это как вопрос, они просто голосуют как дубликаты. Я покажу свои сущности, контроллер и formType ..... спасибо заранее :) –

ответ

0

РЕШЕНИЕ

мне удалось решить предыдущую проблему путем изменения 'FileType' в 'CollectionType' в buildForm ImageFile класса функция()

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('files', CollectionType::class, array(
       'attr' => array(
        'accept' => 'image/*', 
        'multiple' => 'multiple' 
       ) 
      )) 
      ->add('save',SubmitType::class,array('label'=>'Insert Image','attr'=>array('class'=>'btn btn-primary','style'=>'margin-bottom:15px'))) 
     ; 
    } 

Я также изменил 'файлы', как этот

/** 
    * @var array 
    */ 
    private $files; 

    public function __construct() 
    { 
     $this->files = new ArrayCollection(); 
    } 

Однако, когда я это делаю, кнопка «просмотр изображений» исчезает из представления. Любые предложения по исправлению этого?

Я также попытался удалить функцию construct(). Когда я это делаю, это дает мне ошибку в контроллере, говоря «неверный аргумент, предоставленный для foreach».

1

Этот код здесь проблема:

/** 
* @Assert\File(maxSize="60000000") 
*/ 
private $files= array(); 

Вам нужно исправить. Вы утверждаете, что это файл, но затем вы указываете, что это массив!


EDIT # 2

Ваша upload функция имеет проблемы тоже. Вы возвращаете тот же параметр, который вы передаете ($ images). Таким образом, вы должны изменить его следующим образом:

/** 
* @param satelliteImage[] $images 
* 
* @return satelliteImage[] 
* 
*/ 
public function upload($images){ 
    foreach ($this->getFiles() as $key => $file) { 
     $img[$key]->setImage(file_get_contents($file)); 
    } 
    return $img; 
} 

EDIT # 3

buildForm функция кажется, нормально. В вашем контроллере, я думаю, вам нужно создать класс и загрузить форму, как это:

$images = new SatelliteImages(); 

$form = $this->createFormBuilder($images); 
$form->handleRequest($request); 

if ($form->isSubmitted() && $form->isValid()) { 
    $images = $form->getData(); 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($images); 
    $em->flush(); 

    return $this->redirectToRoute('some_path'); 
} 

Можете ли вы попробовать? Не уверен, что это проблема или нет.

+0

Я изменил это на @var массив, но я все равно получаю ту же самую точную ошибку. Я думаю, проблема в функции setFIles() или в построителе –

+1

См. Раздел EDIT # 2. –

+0

Я сделал EDIT # 2, который вы предложили, но я до сих пор не могу пройти мимо предыдущей ошибки, можете ли вы проверить функцию строителя в классе imageFile –

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