bhari
bhari

Reputation: 291

how to get the uploded filenames of a form in the controller

i used the following code in the controller inorder to get the filenames of the uploaded files My controller is

class uploadController extends Controller

{

public function uploadAction(Request $request)
{

$id= $_GET['id'];


$user = new attachments();

$form = $this->createFormBuilder($user)->add('files','file',array("data_class" => null,"attr"=>array("multiple" =>"multiple",)))->getForm();

$formView = $form->createView();

    $formView->getChild('files')->set('full_name','files[]');
if ($request->getMethod() == 'POST') 

  {

            $em = $this->getDoctrine()->getManager();
            $data = $form["files"]->getData();
   }
}

when i print the $data it is not giving the filenames of uploaded files it is returning the null values

my entity is:

use Symfony\Component\HttpFoundation\File\UploadedFile;

class attachments
{

private $id;

/**
 * @var integer
 * @ORM\Column(name="user", type="integer", nullable=false)
 * @ORM\ManyToOne(targetEntity="users", inversedBy="annotations")
 */
protected $userId;

/**
 * @var string
 * 
 * @Assert\File(maxSize="6000000")
 * @ORM\Column(name="files", type="array", length=255, nullable=true)
 */
public $files=array();
public function __construct() 
{

}
/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}
 /**
 * Set userId
 *
 * @param integer $userId
 * @return attachments
 */
public function setUserId($userId) 
{
    $this->userId = $userId;
    return $this;
}
/**
 * Set files
 * @param object $files
 * 
 * @return attachments
 */
public function setFiles($files)
{
    $this->files = $files;
}
 /**
 * Get files
 *
 * @return object 
 */
public function getFiles()
{
    return $this->files;
}

 public function uploadFiles() 
{
    // the files property can be empty if the field is not required
    if (null === $this->files) 
{

        return;
    }
else
{
        $this->files->move($this->getUploadRootDir(), $this->files->getClientOriginalName());
    }
    $this->setFiles($this->files->getClientOriginalName());
}
/**
 * Get userId
 *
 * @return integer 
 */
public function getUserId()
{
    return $this->userId;
}
public function getAbsolutePath()
{
    return null === $this->path
        ? null
        : $this->getUploadRootDir() . DIRECTORY_SEPARATOR . $this->path;
}

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

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

protected function getUploadDir()
{
    return 'uploads/';
}

}

Upvotes: 0

Views: 1825

Answers (1)

Nicolai Fröhlich
Nicolai Fröhlich

Reputation: 52493

Uploaded Files in Symfony2 are of type Symfony/Component/HttpFoundation/File/UploadedFile.

You can get the original client name ( php will rename files when putting them into php_upload_tmp_dir ) with:

$file->getClientOriginalName();

... move the file to a new location with:

$file->move('path/to/your_file', 'new_name.jpg');

You can not use the assert File Constraint for an array.

* @Assert\File(maxSize="6000000")
*/
 protected $files = array();

Therefore you need the All constraint.

Furthermore you can't just call the move method on an array or collection... you will have to loop over the collection/array.

$this->files->move('..')    // this is never going to work...

Use an array collection and create a property for your uploaded files if thats what you want.

protected $files;

protected $uploadedFiles;

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

If you want to transform your Doctrine Collection of UploadedFile entities into an Array do the following:

$collection = $entity->getFiles();
$array = $collection->toArray();

But whatever you're trying to do ... better use OOP instead of arrays like you're attempting here.

Upvotes: 1

Related Questions