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

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