Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cargar un fichero en una entidad como datafixture Symfony2

22 de noviembre de 2013

Buenas, estoy tratando de añadir una variable fichero a una de mis entidades y para ello he incluido en ella todas las funcionalidades (variables y métodos) de la clase Document del cookbook de Symfony, incluyendo los "Lifecycle Callbacks", con vistas a que posteriormente los usuarios del backend puedan subir esos ficheros en un formulario.

Sin embargo, ahora estoy desarrollando el frontend y quiero añadir como data fixtures esos ficheros con el siguiente método (incluido en la clase Document del enlace anterior):

/**
 * Sets file.
 *
 * @param UploadedFile $file
 */
public function setFile(UploadedFile $file = null)
{
    $this->file = $file;
    // check if we have an old image path
    if (isset($this->path)) {
        // store the old name to delete after the update
        $this->temp = $this->path;
        $this->path = null;
    } else {
        $this->path = 'initial';
    }
}

Los ficheros PDF los guardo en el directorio web/uploads/. Parte del fichero que carga los data fixtures:

$acme = new Acme();
$upfile = new UploadedFile("./web/uploads/1.pdf", "1.pdf", "application/pdf", "35");
$acme->setFile($upfile);

Cuando ejecuto el comando php app/console doctrine:fixtures:load me lanza la siguiente excepción:

[Symfony\Component\HttpFoundation\File\Exception\FileException]              
  The file "ruta_fichero" has not been uploaded via Http

Investigando un poco, he averiguado que esta excepción es lanzada por el método move(), usado en el método upload() que está implementado en la clase Document a la que he hecho mención al principio. Concretamente, dentro del código interno de move(), es el método is_upload_file() de PHP el que me provoca este error puesto que detecta que los ficheros que intento asignar a la entidad no han sido subidos mediante un formulario (me imagino que verá que el nombre del fichero no está en $_FILE)

Mi pregunta es: ¿Hay alguna forma de engañar a esta función para persistir los ficheros en la entidad como data fixture, sin necesidad de subirlos vía HTTP?

PD: Se que is_upload_file() se usa para temas de seguridad y programas maliciosos. Seguiré investigando.


Respuestas

#1

Aquí está la solución para los futuros interesados, que consiste simplemente en utilizar la instancia de la clase padre File en lugar de UploadedFile tanto en la entidad como en el Datafixture.

@Jorge_Gante

24 noviembre 2013, 13:12
#2

No se si en tu caso se podría hacer, pero como hablas de fixtures, creo que se podría hacer de otra manera. Como con los fixtures lo que tienes que hacer es cargar lo más rápido y fácil posible los datos de la aplicación, no sería necesario utilizar el método setfile() y todos los otros métodos internos que lleva asociados.

En otras palabras, dentro de la clase que carga los fixtures podrías guardar directamente en la entidad la ruta del archivo y copiarlo en el directorio web/uploads/, sin tener que ejecutar toda la lógica de la entidad relacionada con los archivos.

@javiereguiluz

24 noviembre 2013, 22:34