La presente es un tutorial de como implementar un sistema de alojamiento de imágenes hecho en PHP, este ejemplo esta basado en Upload de Archivos con PHP, este sistema consiste en un formulario para seleccionar la imagen, luego se verifica el tipo de archivo para luego guardarlo en el servidor, finalmente se genera una ruta mediante el cual se puede acceder a la imagen.
Crear el formulario
El primer paso es crear un formulario en donde se pueda seleccionar la imagen a subir, para ello el formulario debe tener la propiedad enctype=»multipart/form-data» el cual permitirá enviar archivos mediante el formulario. Además de ello agregamos un campo input file llamado imagen.
<form action="" method="post" enctype="multipart/form-data"> <input name="imagen" type="file" size="35" /> <input name="enviar" type="submit" value="Upload Image" /> <input name="action" type="hidden" value="upload" /> </form>
Definir variables Iniciales
Antes de hacer el upload de la imagen, definimos nuestras variables, las cuales utilizaremos, primero creamos un numero aleatorio que lo utilizaremos como nombre de la imagen, también definimos un array con todos los tipos de archivos que se aceptará, la ruta que le asignaremos a las imágenes y una variable donde guardaremos el estado del proceso.
$varrand = substr(md5(uniqid(rand())),0,10); $varallw = array("image/bmp","image/gif","image/jpeg","image/pjpeg","image/png","image/x-png"); $varpath = "http://samples.unijimpe.net/imagehosting.php?image="; $varstat = "";
Guardar la Imagen en el Servidor
El siguiente paso es guardar el archivo recién ingresado en el servidor, para ello tendremos una carpeta llamada tmp en donde almacenaremos los archivos. Lo primero es verificar si se ha subido correctamente el archivo, para ello utilizamos la función is_uploaded_file, luego obtenemos el mimetype del archivo para verificar que se esta subiendo solo imágenes y a continuación guardamos el archivo en la carpeta tmp.
if (is_uploaded_file($_FILES["imagen"]["tmp_name"])) { $varname = $_FILES["imagen"]['name']; $vartemp = $_FILES['imagen']['tmp_name']; $vartype = mime_content_type($vartemp); if (in_array($vartype, $varallw) && $varname != "") { $arrname = explode(".", $varname); $varname = $varrand.".".$arrname[1]; if (copy($vartemp, "tmp/".$varname)) { $varpath = $varpath.$varname; $varstat = "ok"; } else { $varstat = "Error al subir el archivo"; } } else { $varstat = "Archivo no valido"; } }
Mensaje de Confirmación
Si es que se ha completado el proceso, mostramos el mensaje de confirmación, además de los enlaces para que pueda ser copiado y también mostramos la imagen recién subida.
<?php if ($varstat == "ok") { ?> <strong>Confirmacion:</strong><br> Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:<br> <strong>Enlace Directo: </strong><br> <input name="txt2" type="text" value="<?php echo $varpath; ?>"> <img src="tmp/<?php echo $varname; ?>"> <?php } ?>
Mostrar la imagen Archivada
Lo que sigue es mostrar la imagen guardada, basado en el enlace que se ha brindado al usuario, en este enlace se pasa el nombre de la imagen como parámetro GET, verificamos que exista esta variable y luego mostramos la imagen.
<?php if ($_GET['image'] != "") { ?> <img src="tmp/<?php echo $_GET['image']; ?>"> <?php } ?>
Finalizando
El paso final es unir todas estas partes en un solo archivo y agregarle una hoja de estilos para mejorar la apariencia. He creado una página de ejemplo, pueden utilizar esta página de ejemplo para verificar el funcionamiento pero no utilizarlo para alojar sus imágenes pues estaré eliminando periódicamente las imágenes subidas.
Comentarios Total 142 comentarios
Publicado: 02/05/2008 7:56 pm
Bueno mi pregunta esque… copie la base de datos que tu tenias…. y lo puse en el mio, i modifique la web… solo eso para ver si funcionaba y seguia dandome error :S
este es el error:
Warning: copy() [function.copy]: Unable to access tmp/2ef3943b30.gif in /home/webcindario/t/r/trucosmsnfotos/imagehosting.php on line 16
Warning: copy(tmp/2ef3943b30.gif) [function.copy]: failed to open stream: No such file or directory in /home/webcindario/t/r/trucosmsnfotos/imagehosting.php on line 16
Que devo hacer?
Publicado: 02/05/2008 8:05 pm
Ya lo arregle :D
se me avia olvidado subir el archivo TMP la carpet axDDDDDDDDDDDDd
Publicado: 04/05/2008 12:56 am
Bueno, me gustaria donde va esto:
1.- Para crear y mostrar el link directo a la imagen deben colocar un campo de texto adicional despues de los dos campos ya existentes:
Enlace Absoluto
<input name=”txt3″ type=”text” value=”http://samples.unijimpe.net/”>
eso lo pusiste… tu ini pero nose donde ponerlo :S no entiendo esos dos campos ya existentes… podrias ponerlo tu en, una web… para copiartelo porfa … gracias
Publicado: 11/05/2008 12:55 pm
hola yo quiero que me echen la mano por que tengo que crear un servicio de hosting en codigo php… espero sus respuestas
Publicado: 18/05/2008 5:16 pm
Hola…
No me funciona el código de tamaño que pusiste más arriba… me sube archivos .PNG de los pesados pero no me coje JPG.
Slds, espero respuesta.
Publicado: 18/05/2008 7:17 pm
Por cierto… ¿Se puede hacer que suba los archivos a una dirección diferente?, ej:
La dirección del Script es:
http://www.pagina1.com/script/
Que aloje las Imagenes en:
http://www.pagina2.com/tmp/
Si se puede, ¿como se hace?…
Publicado: 12/06/2008 4:31 pm
hola perdon la molestia pero no conosco mucho sobre php y quiero saver alguna forma para hacer que mi enlace que me da la imagen funcione y no lo hace.
Me explico yo subo la imagen, todo bn, se me copia a la carpeta tmp y todo.
pero cuando quiero abrir la imagen a traves del link que me da no funciona …
que hago ??
tengo que cambiar lo que dice:
ttp://samples.unijimpe.net/imagehosting.php
en caso de que si ¿porque lo debo susplantar para que me funcione?
Publicado: 12/06/2008 7:59 pm
bueno ya lo de arriba lo solucione pero cuando dejo un tiempo mis archibos que subi se me eliminan.
como que el link no funciona mas…¿a uqe se debe?
Publicado: 18/09/2008 1:59 pm
miren lo que em pasa:
yo tenia el mismo problema (no em acuerdo quien era de aca) y me decia archibo no valido cada ves que subia una imagen entonces agregue como le habian repsondido una linea «image/jpg» a la linea 2 en array bueno hice eso y me funciono pero lo que pasa es que ahora sale un mensaje justo cuando te metes en la pag. que es este:
Warning: Division by zero in /home/webcindario/m/a/mati-2i/imagehosting.php on line 3
¿que hago? porque sin ese «image/jpg» no me funciona el upload…
Publicado: 29/09/2008 6:40 pm
Hola hey como puedo hacer para lograr hacer que suba a otra carpeta?
intente hacer esto:
PHP ImageHosting – unijimpe
PHP ImageHosting – unijimpe
Aloja gratuitamente tus imagenes con PHP ImageHosting:
Confirmación:
Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:
Enlace HTML:
<input name=’txt1′ type=’text’ value='<a href=»»><img src=»» border=»0″ />‘ size=’60’>
Enlace Directo:
<input name=’txt2′ type=’text’ value=» size=’60’>
Error:
<img src=»tmp/»>
<img src=»tmp/»>
Publicado: 19/01/2009 2:37 pm
Unjimpe, me gustaria saber si me puedes ayudar, me podrias preparar una descarga del imagehosting.php como para mi host (avatidata.gratishost.com), porque no sé como configurarlo :S
Publicado: 19/01/2009 5:52 pm
Unjimpe, ya logré arreglarlo! Muy buen tutorial, genio del PHP xD
Publicado: 20/01/2009 1:18 pm
Una cosa mas xD. Como hago para que se puedan subir archivos .txt? O .dcr o no sé, mas o menos eso.
Publicado: 20/01/2009 4:00 pm
Ya lo logré hacer, gracias al error de uno de los usuarios, ahora el tema es, como hacer para que NO previsualise el archivo?
Publicado: 26/01/2009 9:42 pm
Uhmm.. Bueno acabo de leer todos los comentarios y hicieron un muy buen trabajo, pero tengo una duda.
Como hago que la carpeta TMP deje de ser temp y sea un host fijo.
Para subir imagenes en el host ftp que tengo.
Salu2
Publicado: 15/02/2009 3:51 pm
Exelente tuto… Ahora a ver si alguien me ayuda… Quiero guardar el nombre con la extensión en mi DB mysql… Pero no puedo… Registro el nombre le cambie para poner otro nombre y demas… Pero no puedo guardar la variable $varname … Lo que si lo modifique para que lo corra en el archivo de preceso datos…
Publicado: 12/05/2009 6:36 am
Hola a todos
Este script tiene un fallo de seguridad ya que se puede subir toda clase de archivos que no sean imagenes como por ejemplo php.
Como para subir un archivo php como imagen el archivo debe tener el siguiente nombre.
imagen.php.jpg
el resulado seria que tengas un archivo php en tu servidor con lo que te pueden hacer mucho daño.
Pueben a subir un archivo php y agregue la exencion .jpg al archivo y veran como lo deja subir.
Saludos
Publicado: 13/05/2009 4:34 pm
Como le hago para cargar dos o mas fotos en el mismo ?
Publicado: 31/05/2009 12:12 pm
Bueno mira «unijimpe», resulta que he encontrado un problema serio de seguridad en este código, así que lo solucione y bueno entrego la solución:
Bueno remplacen esto:
$arrname = explode(«.», $varname);
$varname = $varrand.».».$arrname[1];
Por esto:
$arrname = Extention($varname);
$varname = $varrand.».».$arrname;
y agregen esta función:
Function Extention($File)
{$Point= explode(«.» , $File);
$Ext= $trozos[ count($Point)-1];
return strtolower((string) $Ext);}
Razón:
Bueno, resulta que si no hacen esto, el upload lo que hará es no reconocer la extencion final ya que solo reconoce el primer punto.
Ejemplo:
imagen.2009.gif
Esto haría que subiera con la extencion «.2009»
pero ahora subiría con la extencion «.gif»
Bueno, espero haber ayudado en algo, si encuentro mas problemas, yo les aviso, y cualquier duda pregunten.
Publicado: 31/05/2009 12:38 pm
Olafa, gracias por tu contribución, efectivamente yo había asumido que los archivos no tendría en punto en nombre del archivo, pero tu lo has resuelto.
Gracias.
Publicado: 03/06/2009 4:22 pm
Hola bueno hay otro problema con la deteccion de archivos en PHP hacia IE…
Bueno lo he solucionado y les paso:
Original:
#
$varallw = array(«image/bmp»,»image/gif»,»image/jpeg»,»image/pjpeg»,»image/png»,»image/x-png»);
Remplazar por:
array(«image/bmp»,»image/gif»,»image/jpeg»,»image/pjpeg»,»image/png»,»image/x-png»,»image/pjpeg»,»image/wbmp»);
La razon es que asi no tendran problemas a la hora de detectar si el archivo es PNG, BMP, GIF o JPG, puesto que he añadido unos mime que lo haran mas especifico…
Bueno espero que les halla ayudado…
Publicado: 30/06/2009 9:39 pm
No anda tu solucion ya que me tira error , por favor postea todo el codigo :D
Publicado: 30/09/2009 4:57 pm
Y si subo una imagen que ya se encuentra guardada en el servidor con el mismo nombre que pasa? sobre escribe la que ya esta???
Publicado: 30/09/2009 10:50 pm
El ejemplo crea un nombre aleatorio por cada archivo que se sube, esto para prevenir que se reemplazen archivos que tengan el mismo nombre.
Publicado: 24/10/2009 5:50 pm
che me funcionó todo correctamente hasta que al poner el link de la imagen en mi pagina no aparece nada
Publicado: 10/11/2009 1:28 am
Hola, estoy intentando meterle un poco de seguridad a tu script, basicamente antes de que se ejecute, que te pida un nombre de usuario o contraseña, para evitar que cualquiera pueda subir sus fotos, bueno el problema que tengo es que a la hora de intentar subir las fotos (una vez logeado) nuevamente me pide el nombre de usuario y contraseña (por ende no sube nada) y codigo que estoy usando es este:
Logueate
<form name="form" method="post" action="»>
Username:
Password:
Administrador Galeria de Imagenes
Subir Imagenes
Click en examinar para buscar imagen localmente
Confirmación:
Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:
Enlace HTML:
<input name='txt1' type='text' value='<a href="»><img src="» border=»0″ />‘ size=’60’>
Enlace Directo:
<input name='txt2' type='text' value='’ size=’60’>
Error:
<img src="tmp/»>
<img src="tmp/»>
Publicado: 10/02/2010 10:31 pm
una pregunta como hago para ponerle una marca de agua?
Publicado: 12/03/2010 4:02 pm
Hola, primero que nada quiciera felicitar al creador del post, exelente man
En segundo pedir help help help
Arme tal cual me indica en la web y esta todo perfecto pero cuando intento ingresar en el link la imagen no me muestra nada
este es el link del host digamos:
http://imperial-host.com.ar/imagehosting.php
estes es el link de la imagen que subi:
http://imperial-host/imagehosting.php?tmp=47e1d43462.JPG
pero el link de la imagen que subi no me toma como valido
algo que note es que la simagenes van a parar en una carpeta tmp y el link hace referencia a una carpeta image que en ningun momento encontre en el archivo que descargue
saludos
Publicado: 12/03/2010 4:23 pm
hola yo de nuevo y sorry por el doble post, pero no puedo editar mi post anterior
pero la cosa es que en el link que me muestra al subir la imagen:
http://imperial-host/imagehosting.php?tmp=47e1d43462.JPG
obmitio el .com.ar en ves de vincular image vinculo el destino de las imagenes que es en tmp
cuando deberia mostrar asi:
http://imperial-host.com.ar/imagehosting.php?image=f100cf0c17.JPG
alguien sabria como solucionarlo o que hice mal?
Publicado: 03/05/2010 4:57 pm
Hola he podido hacer andar esto sin problemas lo bueno seria unijimpe
que si no es mucho para vos pongas de nuevo los archivos con los cabios de Olaf ya que el primero de los cambios dice agregar una función pero no se donde ponerla y de paso ya quedaria algo bien despues de tantos años desde que iniciaste esta GRAN AYUDA.
Saludos y gracias
Publicado: 11/05/2010 11:38 pm
Hola todo perfecto muchas gracias ! pero una pregunta, de que forma el resultado de la imagen puede ser siempre uno solo, un tamaño especifico
1.- Tamaño maximo y minimo para la carga.
2.- Tamaño para la imagen de «resultado» la que ve quien suba la imagen.
Publicado: 04/06/2010 9:46 pm
Que tal, increible y felicitaciones al creador ahora realmente no soy novato pero tampoco aun profesional…. ahora que pasa ?
segui las instrucciones al pie de la letras pero cuando subo la imagen no accede a ningun lado se queda todo en blanco en la direecion que deberia ir
EJ : /imagehosting.php
se queda ahi y no reaccion mas.
YA AGREGUE ATRIBUTOS = 777 a la carpeta TMP y nada
CONFIGURE EL imagehosting.php EN LA LINEA
$varpath = «http://URL/imagehosting.php?image=»; PONINEDO MI SITIO Y NADA…
Algo hice mal, NO TENGO SERVIDOR GRATIS ES RENTADO POR UNA MEPRESA QUE SE DEDICA A WEB HOSTING.
AYUDA por favor, gracias.
Publicado: 04/01/2011 7:31 pm
como se modifica el logo y esas cosas?
Publicado: 24/01/2011 11:24 pm
Amigo gracias por tu post, y a tus largar horas de aportación yo he estado hora para que me de buenos resultados a la hora de subir una imagen y gracias a todos los que estan en el post y a Ti por el aporte de tus conocimientos muy valiosos y que das de forma gratuita.
gracias.
Publicado: 25/01/2011 2:15 am
Estoy un poco cansado ya que son las 2:48 Am pero aqui esta un buen aporte: :) esta padrisimo y me gustaria saber porqeu no carga la imagen desde el areglo posición 0 o no lo asigna gracias :).
carpeta/nombrealeatorio
$varpath = $varpath.$varname;
$varstat = «ok»;
} else {
$varstat = «Error al subir el archivo»;
echo $varstat;
}
} else {
$varstat = «Archivo no valido»;
echo $varstat;
}
}
}
?>
recibir
<?
//manejo de confirmacion
if ($varstat == "ok") {
echo "Confirmacion:
Archivo publicado satisfactoriamente.
Puedes utilizar las siguientes opciones para enlazarlo:
Enlace Directo:
«;
echo $varMax.» bits.»;
}
// queremos saber cuantos archivos hay e imprimirlos pa mas lala aleatoriamente :)
$uploaddir = ‘imagenes/’; //direccion donde se guarda los archivos
$dir = opendir($uploaddir); //varibale que llama la funcion del directorio
$filesArray = array(); //declaramos un arreglo
$index;
//recorre la carpeta y envia los datos al arreglo
while($fileX = readdir($dir)){
array_push($filesArray,»$fileX»);
}
closedir($dir);
$cantidad = count($filesArray); //dime cuantos archivos hay
//selecciona de forma aleatoria la imagen
$salida=rand(0,$cantidad);
echo «name archivo: $filesArray[$salida]»;
?>
Publicado: 27/01/2011 3:29 pm
Gracias por el tutorial muy bueno unijimpe! me funciono perfecto.
Bien con los cambios de seguridad comentados por ejemplo por Olaf y con los cambios agregando la funcion de mime_content_type,
me da el siguiente error:
Call to undefined function finfo_open() in….
el codigo quedaria me quedo asi:
<?php
if (!function_exists("mime_content_type")){
function mime_content_type($filename) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mimetype;
}
}
$varrand = substr(md5(uniqid(rand())),0,10);
$varallw = array("image/bmp","image/gif","image/jpeg","image/pjpeg","image/png","image/x-png","image/pjpeg","image/wbmp");
$varpath = "http://dragonscar.com/site1/subir_img.php?image=";
$varstat = "";
//verificamos si se ha subido el archivo
if ($_POST["action"] == "upload") {
if (is_uploaded_file($_FILES["imagen"]["tmp_name"])) {
$varname = $_FILES["imagen"]["name"];
$vartemp = $_FILES["imagen"]["tmp_name"];
//verificar que se esta subiendo solo imágenes
$vartype = mime_content_type($vartemp);
//$vartype = $_FILES["imagen"]["type"];
//busca el tipo de archivo en el array
if (in_array($vartype, $varallw) && $varname != "") {
$arrname = Extention($varname);
//colocamos el nombre del prefijo seguido del nombre original de la imagen
$varname = $varrand.".".$arrname;
//copiamos a la carpeta temporal
function Extention($File)
{
$Point= explode("." , $File);
$Ext= $trozos[ count($Point)-1 ];
return strtolower((string) $Ext);
}
if (copy($vartemp, "img/".$varname)){
$varpath = $varpath.$varname;
$varstat = "ok";
} else {
$varstat = "Error al subir el archivo";
}
} else {
$varstat = "Archivo no valido";
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>subir imagenes</title>
</head>
<body>
<table width="420" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="413" height="40" class="titulo">PHP ImageHosting - unijimpe </td>
</tr>
<tr>
<td class="text">Aloja gratuitamente tus imagenes con PHP ImageHosting:</td>
</tr>
<tr>
<form action="subir_img3.php" method="post" enctype="multipart/form-data">
<td height="50" valign="top" class="text">
<input name="imagen" type="file" class="casilla" id="imagen" size="35" />
<input name="enviar" type="submit" class="boton" id="enviar" value="Upload Image" />
<input name="action" type="hidden" value="upload" /> </td>
</form>
</tr>
<?php if ($varstat == "ok") { ?>
<tr>
<td class="textinf"><strong>Confirmación:</strong><br>
Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:<br>
<strong>Enlace HTML:</strong> <br>
<input name="txt1" type="text" value="<a href="<?php echo $varpath; ?>"><img src="<?php echo $varpath; ?>" border="0" /></a>" size="60">
<br>
<strong>Enlace Directo: </strong><br>
<input name="txt2" type="text" value="<?php echo $varpath; ?>" size="60"></td>
</tr>
<?php } else { ?>
<?php if ($varstat != "") { ?>
<tr>
<td class="textinf"><strong>Error:</strong><br>
<?php echo $varstat; ?> </td>
</tr>
<?php } ?>
<?php } ?>
</table>
<?php if ($varstat == "ok") { ?>
<p align="center"><img src="tmp/<?php echo $varname; ?>"></p>
<?php } ?>
<?php if ($_GET["image"] != "") { ?>
<p align="center"><img src="tmp/<?php echo $_GET["image"]; ?>"></p>
<?php } ?>
</body>
</html>
Publicado: 05/05/2011 1:57 pm
Encontre una web donde arreglan el bug de este script es http://www.marcofbb.com.ar/upload-de-imagenes/
Publicado: 18/10/2011 9:54 am
hola unijimpe, muchas gracias por el script, me vino al pelo y funciona de maravilla!
tengo una pregunta, como puedo hacer para que en otra pagina se vea una lista con los archivos subidos?
Publicado: 04/01/2012 4:42 pm
Amigo exeelente el tutoria me ayudo bastante… un favor y de ante mano te lo agradesco… me gustaria modificar el tamaño de la imagen al agregar en el mismo navegador.. se podría hacer esooo y como me das el dato por favor gracias…
Publicado: 24/07/2012 3:18 am
Excelente tutotial observaciones para que funcione
1.- Tu carpeta tmp debe tener las cualidades CHMOD 777
2.-
<?php
$varrand = substr(md5(uniqid(rand())),0,10);
$varallw = array("image/bmp","image/gif","image/jpeg","image/pjpeg","image/png","image/x-png");
$varpath ="http://TU SITIO WEB?image=";
$varstat = "";
Publicado: 24/07/2012 4:12 am
*CODIGO CON ENLACE DIRECTO
*NOMBRE REAL DE LA IMAGEN
*ERROR : Call to undefined function mime_content_type() in (CORREGIDO)
Únicamente me dedique a recopilar todas las soluciones y solicitudes qye varios tuvimos al momento de intentar usar el scrip del sitio.
y Antes de empezar valida
1.- Tu carpeta tmp debe tener las cualidades CHMOD 777.
2.- Yo renombre el archivo original por index.php
Espero sea util para muchos así como lo fue para mi !!!
comentarios a villegasisrael@ivtecnologia.com
PHP ImageHosting - unijimpe
PHP ImageHosting - unijimpe
Aloja gratuitamente tus imagenes con PHP ImageHosting:
Confirmación:
Archivo publicado satisfactoriamente. Puedes utilizar las siguientes opciones para enlazarlo:
Enlace HTML:
<input name='txt1' type='text' value='<a href=""><img src="" border="0" />' size='60'>
Enlace Directo
<input name='txt3' type='text' value='***AQUI RUTA DE ACCESO***/' size='60'>
Error:
<img src="tmp/">
<img src="tmp/">
Publicado: 24/07/2012 4:19 am
Aquí el link con el scrip modifcado (http://www.mediafire.com/?sd8duwf3vyra67v)
*CODIGO CON ENLACE DIRECTO
*NOMBRE REAL DE LA IMAGEN
*ERROR : Call to undefined function mime_content_type() in (CORREGIDO)
Únicamente me dedique a recopilar todas las soluciones y solicitudes qye varios tuvimos al momento de intentar usar el scrip del sitio.
y Antes de empezar valida
1.- Tu carpeta tmp debe tener las cualidades CHMOD 777.
2.- Yo renombre el archivo original por index.php
Espero sea util para muchos así como lo fue para mi !!!
comentarios a villegasisrael@ivtecnologia.com