move and rename file in symfony2

user3592436 picture user3592436 · Jun 7, 2014 · Viewed 9.2k times · Source

I am learning Symfony2, and I am trying to upload an image from a handmade form to a destination folder, but changing its name before.

I think the easiest method is with:

move_uploaded_file(actual_file, destination_with_new_name)

But I get the following error message:

ContextErrorException: Warning: move_uploaded_file(http://localhost/PublisherMyAdmin/web/app_dev.php/imagenesportadas/1.jpg): failed to open stream: HTTP wrapper does not support writeable connections in C:\xampp\htdocs\PublisherMyAdmin\src\ochodoscuatro\IntranetBundle\Controller\MaterialesController.php line 163

My code is:

$dir =  $this->getRequest()->getUriForPath('/imagenesportadas/');
$nombre = $id.".".$extension;

if (move_uploaded_file($_FILES["archivo"]["tmp_name"], $dir.$nombre)) {

    echo "Thank you for uploading your music!<br /><br />";

} else {

    echo "Your file did not upload.<br /><br />";

}

Thank you!

Answer

devsheeep picture devsheeep · Jun 7, 2014

The Symfony2 way of doing this would be similar to the following:

You can get uploaded files from the request object, by accessing the files property. Given you are in a controller context:

// get the request object
$request = $this->get('request');

// retrieve uploaded files
$files = $request->files;

// and store the file
$uploadedFile = $files->get('archivo');
$file = $uploadedFile->move($directory, $name);

By calling get on the FileBag object in $files, you get an instance of UploadedFile, which provides a method move, to store and rename the temporary file.

You get the error message because you're using an HTTP location instead of a filesystem path. Try to store the files somewhere in the web/ folder, for example:

$directory = $this->container->getParameter('kernel.root_dir') . '/../web/uploads/imagenesportadas';