Buscar

Sigue este blog mediante RSS
 

Subir una imagen con PHP

Voy a empezar a poner algunas funciones que voy creando tanto en PHP como en el resto de lenguajes que voy utilizando, así si a alguien le puede servir pues eso que se ahorra.

Esta función la implementé para una página que estoy desarrollando y donde necesitaba poder subir imágenes y renombrarlas en el servidor.

por supuesto si un usuario con foto subia otra nueva debería poder cambiarlas y eliminar la anterior. Los nombres de las fotos deberían ser aleatorios para evitar que varios usuarios subieran fotos con el mismo nombre.

Lo primero que necesitamos es un formulario donde poder subir fotografías, para ello nos creanos uno sencillo con un botón de upload.

Aunque esté implementado en HTML lo podemos poner como php facilmente, en este caso yo lo he llamado cambiarImagen.html

Si no ves bien el código, el caracter < es traducido por < ó >, si quieres copiar el código pulsa sobre PLAIN TEXT.

[html]

<h1>Seleccione su nueva imagen.</h1>

<form method=’post’ action=’modifyImagen.php’ enctype=’multipart/form-data’>

<input name=’im’ type=’file’ /><br><br>

<input name=’enviar’ type=’submit’ value=’Cambiar Imagen’ />
<input name=’limpiar’ type=’reset’ value=’Limpiar’ />
</form></center>

[/html]

Este formulario recogerá la foto seleccionada por el usuario y nos la mandará a modifyImagen.php que será el siguiente archivo que deberemos crearnos

[php]

if (is_uploaded_file($HTTP_POST_FILES['im']['tmp_name']) )
{
//recojo la imagen
$imagen = $HTTP_POST_FILES['im']['name'];
//Obtengo el nombre de la imagen y la extensión de la foto
$imagen1 = explode(”.”,$imagen);
//Genero un nombre aleatorio con números y se asigno la extensión botenido anteriormente
$imagen2 = rand(0,9).rand(100,9999).rand(100,9999).”.”.$imagen1[1];
//Coloco la iamgen del usuario en la carpeta correspondiente con el nuevo nombre
move_uploaded_file($HTTP_POST_FILES['im']['tmp_name'], “carpeta/”.$imagen2);
//Asigno a la foto permisos
$ruta=”carpeta/”.$imagen2;
chmod($ruta,0777);
//A partir de aqui sólo si quiero eliminar una foto
//$resultArchivos = mysql_query(”Selecciono el nombre de la foto antigua”);
//$rowArchivos= mysql_fetch_array($resultArchivos);
//unlink(”carpeta/”.$rowArchivos[0]);
echo “Tu nueva imagen ha sido subida.”;
}

[/php]

Lo primero que comprobaremos será si ha mandado una foto, si es así entraremos en el bucle para tratarla, la recuperamos, cambiamos el nombre por uno totalmente aleatorio, la copiamos a una carpeta determinada y le asignamos permisos. Ahora sólo queda borrar la anterior.

Si quieres saber algo más sobre la función rand y la función unlink.


Otros temas interesantes


 

7 Comentarios en “Subir una imagen con PHP”

  1. Autor
    1
      moral3jo
     

    no entiendo el codigo
    eso funciona?
    bucle?
    y si te genera dos numeros aleatorios iguales?
    eliminas la foto original con mysql_query??
    la verdad no entiendo nada y no funciona ni de coña ese codigo

    a! que es para despistar a la competencia ;) ok



  2. Autor
    2
      emirodgar
     

    1- Si, funciona, lo tengo en varias páginas.
    2- ¿Donde ves un bucle?
    3- Calcula las probabilidades de obtener un numero aleatorio entre 0 y 9 (10 posibilidades) mas otros dos entre 100 y 9999 (9899 posibilidades cada uno), lo viste el año pasado en matemáticas, en el código original añado algo más para evitar que sean números, no creo que haga falta explicar eso, el que quiera le pone el nombre que más le guste.
    4- Con mysql_query selecciono el nombre, con unlink (manual de php) la elimino.
    5- Bájatelo y lo pruebas.
    6- El código original tiene más cosillas, pudiera ser que al ponerlo aquí pudiera haber puesto algo mal ya que no lo he probado, pero el original te aseguro que funciona.



  3. Autor
    3
      moral3jo
     

    me gusta este juego :)

    >1- Si, funciona, lo tengo en varias páginas.
    seguro que este codigo no

    >2- ¿Donde ves un bucle?
    “Lo primero que comprobaremos será si ha mandado una foto, si es así entraremos en el bucle” 3- Calcula las probabilidades de obtener un numero aleatorio entre 0 y 9 (10 posibilidades) mas otros dos entre 100 y 9999 (9899 posibilidades cada uno), lo viste el año pasado en matemáticas, en el código original añado algo más para evitar que sean números, no creo que haga falta explicar eso, el que quiera le pone el nombre que más le guste.
    La respuesta es -> hay probabilidad (me encantaria ver tu cara si un dia te conectas al msn y ves que tu foto de traje se ha cambiado por la pelota de futbol)

    >4- Con mysql_query selecciono el nombre, con unlink (manual de php) la elimino.
    mysql_query segun manual de php oficial: “Envía una consulta de MySQL” asique, que nombre seleccionas? de donde? esta claro que algo tienes que intentar hacer en mysql asique o buscas el nombre en la base de datos (que no esta), o actualizas algo (que no has metido nada para actualizar) o insertar (creo que sera eso pero no tiene nada que ver con “Selecciono el nombre de la foto antigua”)

    >5- Bájatelo y lo pruebas.
    eso he hecho y no voy a dormir hasta que no lo consiga

    >6- El código original tiene más cosillas, pudiera ser que al ponerlo aquí pudiera haber puesto algo mal ya que no lo he probado, pero el original te aseguro que funciona.
    Estoy seguro pero vamos, no seas perro. Si me confundo dilo y sino no pongas cosas a medias



  4. Autor
    4
      emirodgar
     

    Seguimos:

    Este código es el que uso, lo único que uso variables mias que no vienen al caso y he decidido eliminarlas, pero el código es ese.

    Cualquiera con dos dedos de frente y mínimos conocimientos de php puede hacer funcionar este código.

    Ejemplo:

    1- Bajo el código (1:31)
    2- Comento el eliminar foto porque como no hay anteriores solo voy a subir. (1:31)
    3- Lo ejecuto en mi ordenador. (1:31)
    2- Fallo en la linea 13 al cambiar los permisos del archivo subido y en la función move_loaded (1:31)
    3- Abro el código para ver donde falla y corrijo la función a move_uploaded (move_loaded no existe). (1:32)
    4- Resulta que no copio la imagen porque la linea donde se copia está comentada (fallo mio al comentar el código para ponerlo aqui) (1:32)
    5- Borro las dos lineas (//) delante de la sentencia (1:33)
    6- Ejecuto: funciona perfectamente. (1:33)

    Ya puedes dormir tranquilo.

    Más:

    Veamos sobre lo de eliminar la foto, si usas una sesión en php tendrás un id_user o también puedes pasarlo por get o post hacia el formulario ModifyImagen.php.

    Con MySQL simplemente haces una consulta a la BD y sacas el nombre de la foto asociado al usuario cuyo id_user acabas de obtener por $_SESSION, $_GET, $_POST lo que toque.

    Una vez que tienes el nombre de la imagen del usuario, llamas a la función unlink pasandole ese parametro (ruta) y la borra.

    Esto no quiere decir que sea necesario borrar una foto siempre, si comentas el código sólo subes, si quieres borrar para ahorrar espacio usas la función y la consulta.

    Esto supuse que quedaba bastante claro, y que cualquiera podía darse cuenta que si sólo quiere subir pues comenta el borrar y que si quieres borrar la foto te buscas la vida para conseguir el nombre de la foto antigua por eso solo puse un “seleccionamos foto”

    Elcódigo funciona perfectamente, y el que sepa php lo puede modificar a su gusto, tenías razón que de primeras no funcionaba, simplemente por una linea comentada que cualquiera podría arreglar, pero de ahí a que sea un perro y vaya colgando códigos que están mal…

    PD: Los dos fallos que tenía el código, fueron cometidos al pasar el código y comentarlo, pero no he tardado ni 1 minuto en arreglarlos.

    PD2: Ya he arreglado los fallos en el código sería para mi un honor que lo descargaras y lo probaras :D



  5. Autor
    5
      Emilio » Multiupload de ficheros
     

    [...] subir archivos a un servidor, podemos hacer uso de php y seguir las indicaciones del artículo subir imágenes con php, de la misma manera que subimos una imagen, podremos subir cualquier otro [...]



  6. Autor
    6
      Diseño Web Peru
     

    Que buen aporte gracias

    —————————



  7. Autor
    7
      Diseño Web Peru
     

    aqui te paso el codigo espero que te ayuda en algo

    Cantidad1 :
    Cantidad2 :
    Cantidad2 :

    <?php
    $uploaddir=$_SERVER['DOCUMENT_ROOT'].”/perwaq/multi_imagen/ima/”;

    if(isset($_POST['Submit'])){
    $cantidad2 =count($_FILES["archivo"]);
    for ($j=0;$j<=$cantidad2;$j++){
    $archivo = $_FILES["archivo"]["tmp_name"][$j];
    $tamanio = $_FILES["archivo"]["size"][$j];
    $tipo = $_FILES["archivo"]["type"][$j];
    $nombre = $_FILES["archivo"]["name"][$j];

    $x=$j;
    do{
    $x++;
    if( $archivo != “” ){
    $fp = fopen($archivo, “rb”);
    $contenido = fread($fp, $tamanio);
    $contenido = addslashes($contenido);
    fclose($fp);
    //AQUI INSERTE EN LA BASE DE DATOS

    if(copy($archivo, $uploaddir.$nombre))
    {
    echo $nombre.” Subido con Exito”;
    }
    }
    }while($x



Deja un comentario