entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

$_FILES['file']['name'] me devuelve vacío

if(!empty($_FILES)) 
{ 
     $tempFile = $_FILES['file']['tmp_name'];//this is temporary server location

     // using DIRECTORY_SEPARATOR constant is a good practice, it makes your code portable.
     $uploadPath = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $upload_dir . DIRECTORY_SEPARATOR;

     // Adding timestamp with image's name so that files with same name can be uploaded easily.
     $mainFile = $uploadPath.time().'-'. $_FILES['file']['name'];
     move_uploaded_file($tempFile,$mainFile);
}

Este código me sube correctamente un archivo al servidor, más o menos una cosa así: 1000234-nombreArchivo.pdf

Estoy teniendo un problema, que después quiero obtener el nombre del fichero para almacenarlo en la BD y lo que hago es antes de move_uploaded_file pongo: $nombreArchivo = $_FILES['file']['name']; pero me devuelve vacío.
Sin embargo, el archivo lo sube correctamente al servidor y con su nombre.pdf
¿Por qué pasa esto?

Gracias.

0voto

carlossevi comentado

Aclara por favor lo siguiente:

En el título de la pregunta dices que lo que te da error es $_FILES['type']['name'] pero en el texto de la pregunta $_FILES['file']['name']. Si fuese lo primero ahí tienes la respuesta: no se ha subido ningún archivo con el identificador "file" y tienes una errata en el código.

0voto

danielreales7 comentado

Si me equivoque es $_FILES['file']['name'], sabrías porqué pasa esto?

0voto

carlossevi comentado

Deberías ponernos el código completo para ver si se nos ocurre por qué no devuelve un valor en el punto que lo estás usando porque una cosa parece clara: cuando lo usas la primera vez sí que está devolviendo el valor correcto:

$mainFile = $uploadPath.time().'-'. $_FILES['file']['name'];

Si en esa línea no funcionase no conseguirías que el fichero se trasladase correctamente, y según dices sí que lo hace.

Entiendo que tu código hace:

  1. Mover el archivo a una carpeta destino con el nombre original
  2. Almacenar el nombre del archivo en la BBDD

Si te falla la parte 2 ¿por qué nos pones el código de la 1 nada más?

0voto

danielreales7 comentado

No puedo mandarte el mensaje, nose porqué no me deja.

0voto

danielreales7 comentado

include('conexion.php');
     $fecha = date('Y-m-d H:i:s');
     $sql = "INSERT INTO T_DOCUMENTOS (NOMBRE, FICHERO, ID_TIPODOC, ID_USUARIO, F_ALTA, F_BAJA, F_MODIF, ID_YEAR) VALUES ('$nombre_fichero', '$mainFile', '$id_documento', '$id_usuario', '$fecha', null, null, '$id_fecha')";
     //echo $sql;die;
     $resultado = mysqli_query($conexion,$sql);

     if(!$resultado){
        $no_subido = md5("no");
        header('Location: index.php?respuesta='.$no_subido);
     }else{
        $subido = md5("si");
        header('Location: index.php?respuesta='.$subido);
     }

Eso es la continuación del archivo. Después de moveupload y el en Insert la variable nombre_fichero contiene $_FILES['file']['name'] y eso es lo que me devuelve vacío.

0voto

carlossevi comentado

¿Hay algún inconveniente por el que no puedas subir el código completo? En ese script no se ve dónde se asigna el valor a la variable $nombre_fichero ni la continuación entre el primer código que has puesto y el segundo. Hay que tener en cuenta que la variable global $_FILES está disponible durante la llamada que atiende la petición POST y no en las sucesivas y esto puede afectar.

0voto

danielreales7 comentado

El problema es debido a que uso la librería de dropzonejs y me está subiendo directamente el archivo al arrastrar el documento y por eso le llega vacío porque cuando lo manda por post no llega nada.

0voto

carlossevi comentado

Entonces tienes que hacer que la parte donde guardas el registro en la BBDD se ejecute en la misma petición que la que mueve el archivo. Según interpreto ahora te pasa:

  1. Dropzone.js sube el archivo, tu lo procesas y lo mueves de carpeta.
  2. "Aceptas" el formulario y vuelves a hacer un POST al servidor, pero en este caso va vacío.

Si es eso lo que sucede tienes que conseguir terminar todas las tareas en la primera petición.

0voto

danielreales7 comentado

Claro eso tendría que hacer pero no se me ocurre una forma de hacerlo...

0voto

carlossevi comentado

Pues en el fichero PHP donde tienes el primer código que nos has puesto (el que mueve el fichero) deberías incluir la funcionalidad de insertar el registro en la BBDD. De esta manera se ejecutará todo junto.

0voto

danielreales7 comentado

Quieres decir haciendo esto:

move_uploaded_file($tempFile,$mainFile,$consulta);

0voto

carlossevi comentado

No, quiero decir que los dos pegotes de código que nos has puesto tienen que ejecutarse en la misma petición al servidor. O bien metiéndolos dentro del mismo fichero o bien mediante include.

A groso modo:

// PRIMER PEGOTE:

if(!empty($_FILES)) 
{ 
     $tempFile = $_FILES['file']['tmp_name'];//this is temporary server location

     // using DIRECTORY_SEPARATOR constant is a good practice, it makes your code portable.
     $uploadPath = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $upload_dir . DIRECTORY_SEPARATOR;

     // Adding timestamp with image's name so that files with same name can be uploaded easily.
     $mainFile = $uploadPath.time().'-'. $_FILES['file']['name'];
     move_uploaded_file($tempFile,$mainFile);
}

// ...
// AQUÍ TENDRÁS MÁS CÓDIGO PORQUE LAS VARIABLES NO SE RELLENAN SOLAS:
// ..

// SEGUNDO PEGOTE: 

include('conexion.php');

     $fecha = date('Y-m-d H:i:s');
     $sql = "INSERT INTO T_DOCUMENTOS (NOMBRE, FICHERO, ID_TIPODOC, ID_USUARIO, F_ALTA, F_BAJA, F_MODIF, ID_YEAR) VALUES ('$nombre_fichero', '$mainFile', '$id_documento', '$id_usuario', '$fecha', null, null, '$id_fecha')";
     //echo $sql;die;
     $resultado = mysqli_query($conexion,$sql);

     if(!$resultado){
        $no_subido = md5("no");
        header('Location: index.php?respuesta='.$no_subido);
     }else{
        $subido = md5("si");
        header('Location: index.php?respuesta='.$subido);
}

0voto

Leonardo-Tadei comentado

Hola Carlos,

por favor, copiá y pegá el comentario de arriba como una respuesta a este pregunta, ya que es una solución posible a la pregunta y ya dejó de ser un comentario aclaratorio de la cuestión.

Saludos!

0voto

carlossevi comentado

Estaba esperando a que el usuario confirmara que efectivamente los dos fragmentos de código son ejecutados en diferentes scripts pero tienes toda la razón, lo paso a respuesta.

2 Respuestas

0voto

jabixo Puntos1580

Hola, yo para subir imágenes lo hago de la siguiente manera,sirve también igual para subir otro tipo de archivos..
En el formulario de subida:

            <input type="file" name="imagen">        

Se lo envío a un archivo Procesa.php , y ahí cuando recojo los datos del form y lo subo a la BD :

Aquí elimino los espacios que puedan haber en el titulo del archivo:

$_FILES['imagen'] = str_replace(" ", "", $_FILES['imagen']);

//Donde se guarda el archivo

    $imagen=move_uploaded_file($_FILES["imagen"]["tmp_name"],"/img/productos/" . $_FILES["imagen"]["name"]);        

    require_once("/inc/conexion.inc.php");
    $consulta = "INSERT INTO productos (imagen) VALUES ('".$_FILES["imagen"]["name"]."'')"; 

Luego haciendo una consulta a la BD del campo imagen, obtienes el nombre.
Un saludo espero que te sirva!

1voto

carlossevi Puntos63580

Como bien dice @Leonardo-Tadei, copio mi comentario como respuesta.
En los comentarios de la pregunta llegábamos a la conclusión de que al utilizar Dropzone.js, el lado cliente de la aplicación está haciendo dos peticiones POST diferentes.

La primera petición la hace Dropzone.js a un script que mueve el archivo.
La segunda petición la hace el propio formulario HTML, pero el file input está vacío en esa petición por lo que al intentar guardarlo en la BBDD tiene problemas.

Es necesario que en el script llamado en la primera petición se haga todo el proceso completo porque sino la variable $_FILES se pierde.

A grandes ragos quedaría:

// PRIMER PEGOTE:

if(!empty($_FILES)) 
{ 
     $tempFile = $_FILES['file']['tmp_name'];//this is temporary server location

     // using DIRECTORY_SEPARATOR constant is a good practice, it makes your code portable.
     $uploadPath = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $upload_dir . DIRECTORY_SEPARATOR;

     // Adding timestamp with image's name so that files with same name can be uploaded easily.
     $mainFile = $uploadPath.time().'-'. $_FILES['file']['name'];
     move_uploaded_file($tempFile,$mainFile);
}

// ...
// AQUÍ TENDRÁS MÁS CÓDIGO PORQUE LAS VARIABLES NO SE RELLENAN SOLAS:
// ..

// SEGUNDO PEGOTE: 

include('conexion.php');

     $fecha = date('Y-m-d H:i:s');
     $sql = "INSERT INTO T_DOCUMENTOS (NOMBRE, FICHERO, ID_TIPODOC, ID_USUARIO, F_ALTA, F_BAJA, F_MODIF, ID_YEAR) VALUES ('$nombre_fichero', '$mainFile', '$id_documento', '$id_usuario', '$fecha', null, null, '$id_fecha')";
     //echo $sql;die;
     $resultado = mysqli_query($conexion,$sql);

     if(!$resultado){
        $no_subido = md5("no");
        header('Location: index.php?respuesta='.$no_subido);
     }else{
        $subido = md5("si");
        header('Location: index.php?respuesta='.$subido);
}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta