Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] APORTE: Función para subir archivos al servidor con PHP

Estas en el tema de APORTE: Función para subir archivos al servidor con PHP en el foro de PHP en Foros del Web. Hola a tod@s, Mi intención era hacer un aporte de una función para subir archivos al servidor, pudiendo añadir después la programación oportuna para agregar ...
  #1 (permalink)  
Antiguo 20/03/2016, 06:59
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
APORTE: Función para subir archivos al servidor con PHP

Hola a tod@s,

Mi intención era hacer un aporte de una función para subir archivos al servidor, pudiendo añadir después la programación oportuna para agregar los datos a una base de datos, el caso es que, aparentemente veo todo bien, pero no funciona y no valida su existe ya el archivo o no, bueno, aquí va el código, se aceptan todo tipo de sugerencias para que funcione y dejar un buen aporte para quien lo pueda necesitar:

Código PHP:
Ver original
  1. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  2. // Función para subir archivos mediante PHP
  3. // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  4. // @param $campo_archivo = $_FILES['nombre_campo'];
  5. // @param $ruta = "ruta_de_subida_del_archivo";
  6. // @param $size = "tamaño máximo permitido en bytes"
  7. // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  8. // @return: Solo retorna en caso de error
  9.  
  10.    // Obtener el tipo MIME del archivo enviado por el usuario
  11.    $finfo = new finfo(FILEINFO_MIME_TYPE);
  12.    $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  13.    
  14.    // Contrastar los tipos MIME
  15.    $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  16.    if($permitidos == FALSE) {
  17.        // Si el archivo no está en la lista de permitidos, devolvemos error.
  18.        return "Error: El archivo enviado no se corresponde a un tipo permitido";
  19.       // Comprobar que el tamaño no excede el permitido
  20.       if ( $campo_archivo['size'] > $size ) {
  21.           return "Error: El archivo enviado es mayor de lo permitido";
  22.          // Si el archivo existe en la ruta, devolvemos error.
  23.          if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  24.             return "Error: Ya existe ese archivo en la ruta definida";
  25.             // Si el archivo no se puede mover a su ruta, devolvemos error.
  26.             if ( !move_uploaded_file($campo_archivo['tmp_name'], $ruta) ) {
  27.                return "Error: Problema al subir el archivo";
  28.             }
  29.          }
  30.       }
  31.    }
  32. }

Bueno, espero que con ayuda, podamos compartir esta función que considero muy útil por la cantidad de gente que necesita hacer esto.
  #2 (permalink)  
Antiguo 20/03/2016, 15:03
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola de nuevo,

Como decimos por aquí: "Mi gozo en un pozo".

Yo quería hacer un aporte que fuese útil para toda la comunidad y resulta que no funciona...

Si alguno de los verdaderos expertos se anima a corregir mi código, sería de agradecer, no creo que a los maestros les resulte nada difícil, yo ya no sé qué hacer... He estado haciendo más pruebas pero no consigo que funcione...

Le he añadido la funcionalidad de comprobar si el directorio de la ruta tiene permisos de escritura:

Código PHP:
Ver original
  1. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  2. // Función para subir archivos mediante PHP
  3. // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  4. // @param $campo_archivo = $_FILES['nombre_campo'];
  5. // @param $ruta = "ruta_de_subida_del_archivo";
  6. // @param $size = "tamaño máximo permitido en bytes"
  7. // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  8. // @return: Solo retorna en caso de error
  9.  
  10.    // Obtener el tipo MIME del archivo enviado por el usuario
  11.    $finfo = new finfo(FILEINFO_MIME_TYPE);
  12.    $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  13.    
  14.    // Comprobar si la ruta tiene permisos para escribir
  15.    if ( !is_writable($ruta) ) {
  16.       // Si no se puede escribir en ella, devolvemos error
  17.       return "Error: No se puede escribir en el directorio especificado";
  18.       // Contrastar los tipos MIME
  19.       $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  20.       if($permitidos == FALSE) {
  21.           // Si el archivo no está en la lista de permitidos, devolvemos error.
  22.           return "Error: El archivo enviado no se corresponde a un tipo permitido";
  23.          // Comprobar que el tamaño no excede el permitido
  24.          if ( $campo_archivo['size'] > $size ) {
  25.              return "Error: El archivo enviado es mayor de lo permitido";
  26.             // Si el archivo existe en la ruta, devolvemos error.
  27.             if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  28.                return "Error: Ya existe ese archivo en la ruta definida";
  29.                // Si el archivo no se puede mover a su ruta, devolvemos error.
  30.                if ( move_uploaded_file($campo_archivo['tmp_name'], $ruta) ) {
  31.                   return "Error: Problema al subir el archivo";
  32.                }
  33.             }
  34.          }
  35.       }
  36.    }
  37. }

Pero sigue sin funcionar... Espero que me podáis corregir...
  #3 (permalink)  
Antiguo 20/03/2016, 15:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Cita:
Pero sigue sin funcionar...
Bueno, podrías comenzar por depurar un poco el código y explicar "qué no funciona".
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 20/03/2016, 15:16
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola pateketrueke,

Muchas gracias por responder y por tu ayuda siempre.

Antes de subir la función como aporte, ya he estado depurando, creo que cada "return" depura en cierto modo, pero el caso es que si intento subir un archivo que no cumple alguna de las condiciones (he probado cada una de ellas), sí me muestra el error, pero si intento subir uno que sí cumpla las condiciones no muestra ningún error (como es lógico) pero tampoco sube el archivo.

La verdad es que no sé cómo más puedo depurar, el único fallo que le encuentro es que no sube el archivo a la ruta especificada (teniendo permisos para ello, claro, por eso le he añadido esta última funcionalidad).

Creo que está todo explicado con detalle, lo que hace cada parte y cómo, pero aún así, no sube el archivo, el resto de las funcionalidades sí hacen "su tarea", pero subir no sube...

Estoy seguro de que tú ya has visto el fallo, pero como "te voy conociendo" , quieres que yo lo encuentre y, créeme que le he estado dando vueltas desde que lo he publicado y no he conseguido encontrar el por qué no funciona como debe.

No sé, si te parece bien ayudarme a resolverlo, creo que podemos ayudar a mucha gente que tiene estos mismos problemas con las subidas de archivos, por eso me he animado a hacerlo, pero me he quedado a medias...
  #5 (permalink)  
Antiguo 20/03/2016, 17:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Pues no me imagino el fallo, en teoría el código luce bien pero no consigo adivinar cómo es que lo utilizas y tampoco qué es lo que obtienes.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 21/03/2016, 02:11
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola pateketrueke,

Para las pruebas lo uso como he puesto en "USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);" lo único que lo asigno a una variable para mostrar si me da alguna respuesta, algo así:

Código PHP:
Ver original
  1. $mime_permitidos = array(
  2.                       "image/png",
  3.                       "mage/tiff",
  4.                       "image/bmp",
  5.                       "image/gif",
  6.                       "image/jpeg",
  7.                       "image/jpg",
  8.                       "image/svg",
  9.                       "image/svg+xml"
  10.                   );
  11.  
  12. $ruta = "ruta_de_subida";
  13. $size = 2097152; // 2MB
  14. $campo_archivo = $_FILES['imagen'];
  15.  
  16. $resultado_subida = SubirArchivos($campo_archivo, $ruta, $size, $mime_permitidos);
  17.  
  18. echo $resultado_subida;

Y, como te decía, no muestra ningún error si subo un archivo correcto (tampoco si subo uno que ya está en la ruta especificada) pero sí muestra los errores correspondientes si intento subir un archivo que no cumpla con las especificaciones requeridas (tamaño, mime_type...) y tampoco muestra error en move_uploaded_file pero no lo sube, con lo que ahí sí debería mostrar error también...

No sé, estoy muy perdido y decepcionado, ya que tenía la intención de aportar algo a toda esta comunidad y no he sido capaz... Por eso el pedir ayuda...

Fíjate que yo estaba seguro de que sí habrías visto qué es lo que falla...

No sé, si se te ocurre algo de por donde tirar, sigo probando hasta que salga bien, me sabe mal haber puesto "APORTE" y que no aporte nada...
  #7 (permalink)  
Antiguo 21/03/2016, 02:16
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola:

Aunque supongo que tendrás bien el formulario no veo que lo compartas... simplemente la omisión del atributo enctype de la etiqueta form suele dar algún dolor de cabeza...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 21/03/2016, 03:08
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola caricatos,

Sí, disculpa, el formulario, como es algo tan elemental, no lo había puesto, pero sí, lleva el atributo enctype="multipart/form-data":

Código HTML:
Ver original
  1. <form name="prueba_archivos" id="prueba_archivos" enctype="multipart/form-data" action="" method="POST">
  2. <p><label for="imagen">Imagen:</label><input type="file" id="imagen" name="imagen" tabindex="1"></p>
  3.  
  4. <p><label for="subir"></label><input type="submit" id="subir" name="subir" value="Subir" class="boton" tabindex="2"></p>
  5. </form>

Como ves, no tiene nada extraño...
  #9 (permalink)  
Antiguo 21/03/2016, 08:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Pues ya descubrí el problema: tu lógica es pésima.
Código PHP:
Ver original
  1. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  2. // Función para subir archivos mediante PHP
  3. // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  4. // @param $campo_archivo = $_FILES['nombre_campo'];
  5. // @param $ruta = "ruta_de_subida_del_archivo";
  6. // @param $size = "tamaño máximo permitido en bytes"
  7. // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  8. // @return: Solo retorna en caso de error
  9.  
  10.    // Obtener el tipo MIME del archivo enviado por el usuario
  11.    $finfo = new finfo(FILEINFO_MIME_TYPE);
  12.    $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  13.  
  14.     // Comprobar si la ruta tiene permisos para escribir
  15.     if (!is_writable($ruta) ) {
  16.       // Si no se puede escribir en ella, devolvemos error
  17.       return "Error: No se puede escribir en el directorio especificado";
  18.     }
  19.  
  20.     // Contrastar los tipos MIME
  21.     $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  22.  
  23.     if($permitidos == FALSE) {
  24.       // Si el archivo no está en la lista de permitidos, devolvemos error.
  25.       return "Error: El archivo enviado no se corresponde a un tipo permitido";
  26.     }
  27.  
  28.     // Comprobar que el tamaño no excede el permitido
  29.     if ( $campo_archivo['size'] > $size ) {
  30.       return "Error: El archivo enviado es mayor de lo permitido";
  31.     }
  32.  
  33.     // Si el archivo existe en la ruta, devolvemos error.
  34.     if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  35.       return "Error: Ya existe ese archivo en la ruta definida";
  36.     }
  37.  
  38.     // Si el archivo no se puede mover a su ruta, devolvemos error.
  39.     if (!move_uploaded_file($campo_archivo['tmp_name'], $ruta) ) {
  40.       return "Error: Problema al subir el archivo";
  41.     }
  42.  
  43.   return true;
  44. }

El tema, es que en tu código original metías todas las condiciones dentro del mismo if() que validaba los campos, pero en todas las validaciones buscas errores: jamás validas cuando todo está en orden.

Es decir:
Código PHP:
SI HAGO ALGO MAL
  
RETURN ERROR
  SI HAGO ALGO MAL
    
RETURN ERROR
    SI HAGO ALGO MAL
      
RETURN ERROR
      ETC
... 
Por eso jamás la lógica se alcanzaba: con un error se detenía todo, sin errores igual nunca entraba a dichos bloques.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 21/03/2016, 15:14
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Hola pateketrueke,

Muchas gracias por tu respuesta, ya sabía yo que a ti no se te escaparía el error que hubiese, además era gordo...

Pero a mi no me funciona, me salta el error "Problema al subir el archivo", he comprobado los permisos, la ruta, todo lo veo bien, pero no sube, y da ese error ¿qué puede ser?

Al final lo voy a tener que dejar por imposible, con la ilusión que me hacía poder aportar algo que pudiera compensar todo lo que me ha ayudado esta comunidad, y a este paso se va a quedar en nada... Qué rabia...
  #11 (permalink)  
Antiguo 21/03/2016, 15:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Pues que raro, porque probé tu código y funcionó perfecto con las correcciones:
Código PHP:
Ver original
  1. <?php
  2.  
  3. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  4. // Función para subir archivos mediante PHP
  5. // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  6. // @param $campo_archivo = $_FILES['nombre_campo'];
  7. // @param $ruta = "ruta_de_subida_del_archivo";
  8. // @param $size = "tamaño máximo permitido en bytes"
  9. // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  10. // @return: Solo retorna en caso de error
  11.  
  12.    // Obtener el tipo MIME del archivo enviado por el usuario
  13.    $finfo = new finfo(FILEINFO_MIME_TYPE);
  14.    $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  15.  
  16.     // Comprobar si la ruta tiene permisos para escribir
  17.     if (!is_writable($ruta) ) {
  18.       // Si no se puede escribir en ella, devolvemos error
  19.       return "Error: No se puede escribir en el directorio especificado";
  20.     }
  21.  
  22.     // Contrastar los tipos MIME
  23.     $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  24.  
  25.     if($permitidos == FALSE) {
  26.       // Si el archivo no está en la lista de permitidos, devolvemos error.
  27.       return "Error: El archivo enviado no se corresponde a un tipo permitido";
  28.     }
  29.  
  30.     // Comprobar que el tamaño no excede el permitido
  31.     if ( $campo_archivo['size'] > $size ) {
  32.       return "Error: El archivo enviado es mayor de lo permitido";
  33.     }
  34.  
  35.     // Si el archivo existe en la ruta, devolvemos error.
  36.     if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  37.       return "Error: Ya existe ese archivo en la ruta definida";
  38.     }
  39.  
  40.     // Si el archivo no se puede mover a su ruta, devolvemos error.
  41.     if (!move_uploaded_file($campo_archivo['tmp_name'], $ruta) ) {
  42.       return "Error: Problema al subir el archivo";
  43.     }
  44.  
  45.   return true;
  46. }
  47.  
  48. if (!empty($_POST)) {
  49.   var_dump(SubirArchivos($_FILES['test'], __DIR__, 2000, array(
  50.     'text/plain',
  51.     'image/png'
  52.   )));
  53. }
  54.  
  55. ?>
  56.  
  57. <form method="post" enctype="multipart/form-data">
  58.   <input type="file" name="test">
  59.   <input type="submit" name="ok">
  60. </form>

Si no te funciona será por algo que no se alcanza a entender con sólo leer tu código, mientras tengas un entorno de desarrollo mal configurado seguirás culpando cualquier cosa.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 21/03/2016, 15:49
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Cita:
Pero a mi no me funciona, me salta el error "Problema al subir el archivo", he comprobado los permisos, la ruta, todo lo veo bien, pero no sube, y da ese error ¿qué puede ser?
Tu problema es que no lees la documentación: la función move_uploaded_file() regresa un valor boleano y tiene tres casos
Cita:
Devuelve TRUE en caso de éxito.

Si filename no es un archivo válido subido, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE.

Si filename es un archivo subido válido, pero no puede ser movido por algunas razones, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE. Adicionalmente, se emitirá un aviso.
El problema se da en esta parte del código
Código PHP:
Ver original
  1. // Si el archivo no se puede mover a su ruta, devolvemos error.
  2.     if (!move_uploaded_file($campo_archivo['tmp_name'], $ruta) ) {
  3.       return "Error: Problema al subir el archivo";
  4.     }

Ya conoces donde esta el problema y que casos tienes que tomar en cuenta, te toca resolverlo.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 22/03/2016 a las 07:54
  #13 (permalink)  
Antiguo 23/03/2016, 10:00
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
APORTE: Función para subir archivos al servidor con PHP (solución completa)

Hola de nuevo,

Bueno, al final, después de comprobar con la empresa de hosting diferentes cuestiones, creo que el aporte puede quedar algo así:

Código PHP:
Ver original
  1. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  2. // Función para subir archivos mediante PHP
  3. // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  4. // @param $campo_archivo = $_FILES['nombre_campo'];
  5. // @param $ruta = "ruta_de_subida_del_archivo";
  6. // @param $size = "tamaño máximo permitido en bytes"
  7. // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  8. // @return: Solo retorna en caso de error
  9.  
  10.    // Obtener el tipo MIME del archivo enviado por el usuario
  11.    $finfo = new finfo(FILEINFO_MIME_TYPE);
  12.    $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  13.  
  14.     // Contrastar los tipos MIME
  15.     $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  16.  
  17.     if($permitidos == FALSE) {
  18.       // Si el archivo no está en la lista de permitidos, devolvemos error.
  19.       return "Error: El archivo enviado no se corresponde a un tipo permitido";
  20.     }
  21.  
  22.     // Comprobar que el tamaño no excede el permitido
  23.     if ( $campo_archivo['size'] > $size ) {
  24.       return "Error: El archivo enviado es mayor de lo permitido";
  25.     }
  26.  
  27.     // Si el archivo existe en la ruta, devolvemos error.
  28.     if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  29.       return "Error: Ya existe ese archivo en la ruta definida";
  30.     }
  31.  
  32.     // Si el archivo no se puede mover a su ruta, devolvemos error.
  33.     $mover_archivo = move_uploaded_file($campo_archivo['tmp_name'], $ruta);
  34.     if ( $mover_archivo === FALSE ) {
  35.       return "Error: Problema al subir el archivo";
  36.     } elseif ( $mover_archivo === FALSE ) {
  37.       return "Error: " . $mover_archivo;
  38.     }
  39.  
  40.   return true;
  41. }

Y el formulario:

Código HTML:
Ver original
  1. <form name="subir_archivos" id="subir_archivos" method="POST" enctype="multipart/form-data">
  2.   <input type="file" name="nombre_del_campo">
  3.   <input type="submit" name="subir" id="subir" value=" Subir Archivo ">
  4. </form>

Para usarlo, con los datos del formulario de ejemplo, tomando como ruta la carpeta "subidas", permitir archivos de tipo imagen y un tamaño de 2 MB, sería así:

Código PHP:
Ver original
  1. // Definir los tipo MIME permitidos para imágenes
  2. $mime_permitidos = array(
  3.                       "image/png",
  4.                       "mage/tiff",
  5.                       "image/bmp",
  6.                       "image/gif",
  7.                       "image/jpeg",
  8.                       "image/jpg",
  9.                       "image/svg",
  10.                       "image/svg+xml"
  11.                   );
  12. // Definimos en una variable la ruta
  13. $ruta = "/home/usuario/public_html/subidas/";
  14.  
  15. // Definimos en una variable el tamaño
  16. $size = 2097152; // 2MB
  17.  
  18. // Comprobamos si el array $_FILES['nombre_del_campo'] está definido
  19. // y no está vacío y se lo asignamos a una variable local, que será un array
  20. // con todos los índices correspondientes al array $_FILES
  21. if ( isset($_FILES['nombre_del_campo']) && !empty($_FILES['nombre_del_campo']) ) {
  22.      $archivo_captura = $_FILES['nombre_del_campo'];
  23. }
  24.  
  25. SubirArchivos($archivo_captura, $ruta.$archivo_captura, $size, $mime_permitidos);
  26.  
  27. //Con solo llamar a la función, nos subirá el archivo a la ruta especificada

Muchas gracias a pateketrueke, caricatos y hhs por su inestimable ayuda sin la cual no habría podido terminar este aporte como tal.

Espero que sea de mucha utilidad a muchas personas.
  #14 (permalink)  
Antiguo 23/03/2016, 10:14
 
Fecha de Ingreso: mayo-2013
Mensajes: 169
Antigüedad: 10 años, 10 meses
Puntos: 25
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Me parecio raro que venga alguien a dar un aporte y realmente este pidiendo ayuda, porque no le funciona.

¿Qué pasa no te suelen ayudar, y necesitas disfrazarlo de aporte para conseguir ayuda más inmediata?
  #15 (permalink)  
Antiguo 23/03/2016, 10:40
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Cita:
Iniciado por Amiancht Ver Mensaje
Me parecio raro que venga alguien a dar un aporte y realmente este pidiendo ayuda, porque no le funciona.

¿Qué pasa no te suelen ayudar, y necesitas disfrazarlo de aporte para conseguir ayuda más inmediata?
Hola Amiancht,

Gracias por tu comentario, tienes razón, es raro hacer un aporte y pedir ayuda. Realmente en esta ocasión no necesitaba la función, me vendrá bien tenerla, pero ahora solo la hice para aportarla.


La verdad es que sí me ayudan muchísimo en este foro y yo ayudo lo que puedo que no es mucho, pero se me ocurrió la idea de crear una función para subir archivos con PHP que validara las opciones requeridas, creé la función y después me di cuenta de que no funcionaba, por eso lo publiqué como aporte y pedí ayuda para completarlo porque quería aportar algo a estos foros que tanto me ayudan pero me quedé a medias.

Al final, aunque no lo haya hecho solo, está el aporte que es lo que cuenta, además, creo que aún es mejor que hayamos colaborado varias personas, ya que esto es una comunidad y así se ve más la idea de ayudarnos.
  #16 (permalink)  
Antiguo 24/03/2016, 07:33
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Cita:
Iniciado por Amiancht Ver Mensaje
Me parecio raro que venga alguien a dar un aporte y realmente este pidiendo ayuda, porque no le funciona.

¿Qué pasa no te suelen ayudar, y necesitas disfrazarlo de aporte para conseguir ayuda más inmediata?


Pienso que es un error haber escrito esto por no se que, un aporte es un aporte, incluso todas las soluciones que se dan en el foro a cada pregunta echa es un aporte, porque todo programador se ha encontrado con soluciones de foros del web en algún momento y esta es bastante buena para simplificar algunas tareas con solo llamar a la función, yo solo le realice algunos cambios menores:

Aqui le elimine el nombre del archivo de la ruta porque los subia con la palabra Array en el nombre:

Código PHP:
Ver original
  1. SubirArchivos($archivo_captura, $ruta, $size, $mime_permitidos);

y aqui le agregue el nombre a la ruta al momento de subir el archivo:

Código PHP:
Ver original
  1. $mover_archivo = move_uploaded_file($campo_archivo['tmp_name'], $ruta.$campo_archivo['name']);

Saludos y Gracias por esta función!
__________________
[email protected]
HITCEL
  #17 (permalink)  
Antiguo 24/03/2016, 08:07
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: APORTE: Función para subir archivos al servidor con PHP

Cita:
Iniciado por xfxstudios Ver Mensaje


Pienso que es un error haber escrito esto por no se que, un aporte es un aporte, incluso todas las soluciones que se dan en el foro a cada pregunta echa es un aporte, porque todo programador se ha encontrado con soluciones de foros del web en algún momento y esta es bastante buena para simplificar algunas tareas con solo llamar a la función, yo solo le realice algunos cambios menores:

Aqui le elimine el nombre del archivo de la ruta porque los subia con la palabra Array en el nombre:

Código PHP:
Ver original
  1. SubirArchivos($archivo_captura, $ruta, $size, $mime_permitidos);

y aqui le agregue el nombre a la ruta al momento de subir el archivo:

Código PHP:
Ver original
  1. $mover_archivo = move_uploaded_file($campo_archivo['tmp_name'], $ruta.$campo_archivo['name']);

Saludos y Gracias por esta función!
Hola de nuevo,

Gracias a ti xfxstudios por tu observación, dejamos aquí como quedaría completo el uso con dicha observación:

Código PHP:
Ver original
  1. function SubirArchivos($campo_archivo, $ruta, $size, $permitidos) {
  2.     // Función para subir archivos mediante PHP
  3.     // USO: SubirArchivos($campo_archivo, $ruta, $size, $permitidos);
  4.     // @param $campo_archivo = $_FILES['nombre_campo'];
  5.     // @param $ruta = "ruta_de_subida_del_archivo";
  6.     // @param $size = "tamaño máximo permitido en bytes"
  7.     // @param $permitidos = array(array con los tipos de archivos permitidos); (http://www.freeformatter.com/mime-types-list.html#mime-types-list)
  8.     // @return: Solo retorna en caso de error
  9.      
  10.        // Obtener el tipo MIME del archivo enviado por el usuario
  11.        $finfo = new finfo(FILEINFO_MIME_TYPE);
  12.        $mime_usuario = $finfo->file($campo_archivo['tmp_name']);
  13.      
  14.         // Contrastar los tipos MIME
  15.         $permitidos = in_array($mime_usuario, $permitidos);  // Devolverá true o false
  16.      
  17.         if($permitidos == FALSE) {
  18.           // Si el archivo no está en la lista de permitidos, devolvemos error.
  19.           return "Error: El archivo enviado no se corresponde a un tipo permitido";
  20.         }
  21.      
  22.         // Comprobar que el tamaño no excede el permitido
  23.         if ( $campo_archivo['size'] > $size ) {
  24.           return "Error: El archivo enviado es mayor de lo permitido";
  25.         }
  26.      
  27.         // Si el archivo existe en la ruta, devolvemos error.
  28.         if ( file_exists($ruta.$campo_archivo['name']) == TRUE ) {
  29.           return "Error: Ya existe ese archivo en la ruta definida";
  30.         }
  31.      
  32.         // Si el archivo no se puede mover a su ruta, devolvemos error.
  33.         $mover_archivo = move_uploaded_file($campo_archivo['tmp_name'], $ruta.$campo_archivo['name']);
  34.         if ( $mover_archivo === FALSE ) {
  35.           return "Error: Problema al subir el archivo";
  36.         } elseif ( $mover_archivo === FALSE ) {
  37.           return "Error: " . $mover_archivo;
  38.         }
  39.      
  40.       return true;
  41.     }



Y el formulario:

Código HTML:
Ver original
  1. <form name="subir_archivos" id="subir_archivos" method="POST" enctype="multipart/form-data">
  2.       <input type="file" name="nombre_del_campo">
  3.       <input type="submit" name="subir" id="subir" value=" Subir Archivo ">
  4.     </form>

Para usarlo, con los datos del formulario de ejemplo, tomando como ruta la carpeta "subidas", permitir archivos de tipo imagen y un tamaño de 2 MB, sería así:

Código PHP:
Ver original
  1. // Definir los tipo MIME permitidos para imágenes
  2.     $mime_permitidos = array(
  3.                           "image/png",
  4.                           "mage/tiff",
  5.                           "image/bmp",
  6.                           "image/gif",
  7.                           "image/jpeg",
  8.                           "image/jpg",
  9.                           "image/svg",
  10.                           "image/svg+xml"
  11.                       );
  12.     // Definimos en una variable la ruta
  13.     $ruta = "/home/usuario/public_html/subidas/";
  14.      
  15.     // Definimos en una variable el tamaño
  16.     $size = 2097152; // 2MB
  17.      
  18.     // Comprobamos si el array $_FILES['nombre_del_campo'] está definido
  19.     // y no está vacío y se lo asignamos a una variable local, que será un array
  20.     // con todos los índices correspondientes al array $_FILES
  21.     if ( isset($_FILES['nombre_del_campo']) && !empty($_FILES['nombre_del_campo']) ) {
  22.          $archivo_captura = $_FILES['nombre_del_campo'];
  23.     }
  24.      
  25.     SubirArchivos($archivo_captura, $ruta, $size, $mime_permitidos);
  26.      
  27.     //Con solo llamar a la función, nos subirá el archivo a la ruta especificada

Muchas gracias a pateketrueke, caricatos y hhs por su inestimable ayuda sin la cual no habría podido terminar este aporte como tal.

Gracias también a xfxstudios por su observación, la verdad es que yo la probé y no me ocurría eso, pero xfxstudios tiene razón, así está mejor

Espero que sea de mucha utilidad a muchas personas.

Etiquetas: html, servidor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:43.