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
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
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