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.
May 03
7 Comentarios / 1,327 lecturas 
Mayo 4th, 2007 a las 11:33 pm
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
Mayo 5th, 2007 a las 12:31 am
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.
Mayo 5th, 2007 a las 1:35 pm
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
Mayo 6th, 2007 a las 12:47 am
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
Abril 7th, 2008 a las 7:48 am
[...] 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 [...]
Julio 26th, 2008 a las 3:06 am
Que buen aporte gracias
—————————
Julio 26th, 2008 a las 6:14 am
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