No existe ninguna imagen

Como crear un sistema para subir imágenes usando Dreamweaver, PHP y MySQL

Puedes ver la segunda parte de este artículo aquí

En el tiempo que llevo participando en la sección de Editores Web de Foros del Web la duda de cómo subir archivos al servidor  (imágenes principalmente) vía http usando Dreamweaver ha surgido múltiples veces. Mi respuesta has sido siempre la misma: “No se puede subir archivos usando funciones de Dreamweaver solamente“. Esta todavía es la realidad, por lo menos hasta el día de hoy que redacto este artículo, aunque reciente alguien volvió a preguntar lo mismo y decidí responder como siempre respondo ese tipo de preguntas: haciendo todo lo que se pueda hacer usando funciones de DW y, el resto, trabajando el código lo mas claramente posible. En este caso decidí expandir un poco mi respuesta con un ejemplo más conciso aquí en mi blog.

En este tutorial estaré discutiendo como acoplar el código PHP necesario al código ya creado por Dreamweaver, osea, no entraré en detalles acerca del HTML/CSS. Tengo pensado hacer una serie de tutoriales de “buenas prácticas” al momento de usar HTML y CSS pronto y ahí pienso abundar más ese tema.

Dicho esto, este es el HTML:

<form id="form1" enctype="multipart/form-data" method="post">
  <label for="imagen">nombre</label>
  <input id="nombre" name="nombre" type="text" />
  <label for="imagen">imagen</label>
  <input id="imagen" name="imagen" type="file" />
  <span class="enviar"><input id="enviar" name="enviar" type="submit" value="Enviar" /></span>
  <input id="tipo" name="tipo" type="hidden" value="general" />
</form>

Lo importante aquí es el hecho que he escogido multipart/form-data como valor del atributo “enctype” del formulario. Esto permitirá al formulario enviar el archivo en la cabecera HTML. Puedes escoger este tipo de enctype seleccionando el formulario y escogiendo esa opción en el menú de Enctype:

También he incluido un input oculto llamado “tipo”. No es algo que normalmente haga, pero esta vez he utilizado las mismas tablas MySQL que de otro post.  De esa forma pudo usar una sola tabla de imágenes y clasificar las mismas según el tipo o la categoría a la que pertenezcan. El archivo SQL lo he incluido en el archivo para descargar.

El CSS es también bastante sencillo ya que no es el foco de este tutorial:

#form1{
	padding: 10px;
	width:250px;
	margin:0 auto;
	background: #F5F5F5;
	border: 1px solid #CCCCCC;
}
#form1 label{display:block;font-weight:bold;padding:5px 0;}
.enviar{display:block; padding:10px 0 5px;text-align:center;}

Hacemos una carpeta para las imágenes y la ponemos en la raíz (root) de nuestro sitio (site) y le damos permisos para leer y escribir (777). Yo la he llamado “imagenes” (Acuérdense que no pueden usar acentos ni eñes (ñ) en los nombres de los archivos, ya sea HTML, imágenes, etc.):

Empezamos creando un “Recordset” escogiendo la tabla de las imágenes.  (Yo tengo DW en inglés, pero espero que sea evidente en la imagen lo que estoy haciendo). En el panel de “applications” vamos a la pestaña de Bindings, hacemos click en el signo de más (+) y escogemos “Recordset (Query)”:

Una vez en la ventana de Recordset se especifica la siguiente información:

  1. El nombre de tu recordset
  2. Tu conexión
  3. La tabla archivos (si usas la tabla creada por el archivo sql que provisto en este tutorial)
  4. Escoges todas las columnas
  5. El filtro que escogeremos es el tipo_archivo. Esta la igualaremos al valor “general”, el cual es el que enviamos en el input “tipo”
  6. En el ‘Sort’ escogemos organizar los “records” de acuerdo a la fecha de manera descendiente para que se muestre primero la última imagen que se subió.

Una vez creado el recordset arrastramos el campo del nombre del archivo al cuerpo de la página. Vamos a hacer un listado de las imágenes que hemos subido al servidor:

Luego creamos la imagen dinámica. Insertamos un “image placeholder”, no importa el tamaño por ahora. Para escoger el source (src) le escogemos el placeholder y le damos click al icono de la carpeta en el panel de propiedades:

Cuando salga la ventana de “Select Image Source” escoges “Data Source” y seleccionas el campo “archivo_archivo” de la base de datos. En ese campo se almacenará en nuevo nombre que le daremos a la imagen. También necesitas añadir “imagenes/”  al principio del campo URL. Esa es la ruta de la carpeta donde almacenaremos las imágenes. No se recomienda almacenar la ruta de las imágenes en la base de datos ya que, si se necesita cambiar la ruta después, tendríamos que cambiar todos los records de la base de datos. En este caso sólo necesitamos cambiar la ruta en el script.

Metemos tanto el nombre como la imagen en una lista (<ul>) escogiendo ambos y dándole al botón de “unordered list”:

El HTML debe ser el siguiente:

<ul>
	<li><img src="imagenes/<?php echo $row_Recordset1['archivo_archivos']; ?>" alt="" /> <?php echo $row_Recordset1['nombre_archivos']; ?></li>
</ul>

Con ven el “alt” de la imagen está vacío. Para proveer una información alternativa de la imagen podemos usar el mismo nombre:

<ul>
	<li><img src="imagenes/<?php echo $row_Recordset1['archivo_archivos']; ?>" alt="<?php echo $row_Recordset1['nombre_archivos']; ?>" /> <?php echo $row_Recordset1['nombre_archivos']; ?></li>
</ul>

Necesitamos hacer dos cosas mas con la lista: 1- hacer que se repitan los elementos conforme con el número de imágenes que se han subido y 2- hacer que la lista solo se muestre si existen imágenes que se han subido.

1- Escogemos el <li> (podemos usar el “code inspector”:

y en panel de Data le damos un comportamiento de repetir. Una vez salga la ventana de repetir escoges el único recordset que existe en la página y escoges enseñar todos los records (no haremos paginación para este ejemplo)

2- Escogemos la lista (el ul , usamos el “code inspector”), y en la panel de Data le damos un comportamiento de mostrar si el recordset no está vacío. Escoges el único recordset y le das al botón de OK:

El HTML se debe ver como sigue:

<?php if ($totalRows_Recordset1 > 0) { // Show if recordset not empty ?>
<ul>
    <?php do { ?>
	<li><img src="imagenes/<?php echo $row_Recordset1['archivo_archivos']; ?>" alt="<?php echo $row_Recordset1['nombre_archivos']; ?>" height="100" /> <?php echo $row_Recordset1['nombre_archivos']; ?></li>
      <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?></ul>
<?php } // Show if recordset not empty ?>

En este caso le damos un alto a la imagen de 100 pixels para que aparezca pequeña. Usualmente uso la clase PHPImagen de okram para crear los thumbnails, pero eso es algo no explicaré como hacerlo en este tutorial.

Ya que tenemos el listado preparado podemos agregar el comportamiento del “insert”. Vale la pena mencionar que se puede hacer de dos formas, usando el panel de “Application” como también con en las herramientas  de “Data” en el panel de “insert”:

1 – Aplicación: Sever Behaviors -> Signo de mós (+) Insert Record

2 – Data: Botón de Insert -> Insert Record:

Una vez en la ventana de “insert record” seleccionas lo siguiente:

  1. El formulario del insert
  2. Tu conexión.
  3. La tabla de archivos o la que estés usando para almacenar la información de las imágenes.
  4. Las columnas de la base de datos (Columns) tienes que hacerlas coincidir con el valor del formulario (Value). En este caso sólo hacemos coincidir dos de ellos: di_tipo = tipo y nombre_archivo = nombre. Los otros campos los agregaremos después de procesar la imagen

Este debe ser el código PHP resultante del insert:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {

  $insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos) VALUES (%s, %s)",
                       GetSQLValueString($_POST['tipo'], "text"),
                       GetSQLValueString($_POST['nombre'], "text"));

  mysql_select_db($database_Juaniq_codigo_con, $Juaniq_codigo_con);
  $Result1 = mysql_query($insertSQL, $Juaniq_codigo_con) or die(mysql_error());
}

Ahora a esa parte le añadimos la parte PHP que se encarga de procesar las imágenes. Después de:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {

Se agrega el siguiente código:

////////////// Parte añadida 1 //////////////

  //carpteta donde vamos a guardar la imagen
  $carpeta = 'imagenes/';
  //recibimos el campo de imagen
  $imagen = $_FILES['imagen']['tmp_name'];
  //guardamos el nombre original de la imagen en una variable
  $nombrebre_orig = $_FILES['imagen']['name'];
  //el proximo codigo es para ver que extension es la imagen
  $array_nombre = explode('.',$nombrebre_orig);
  $cuenta_arr_nombre = count($array_nombre);
  $extension = strtolower($array_nombre[--$cuenta_arr_nombre]);
  //creamos nuevo nombre para que tenga nombre unico
  $nombre_nuevo = time().'_'.rand(0,100).'.'.$extension;
  //nombre nuevo con la carpeta
  $nombre_nuevo_con_carpeta = $carpeta.$nombre_nuevo;
  //por fin movemos el archivo a la carpeta de imagenes
  $mover_archivos = move_uploaded_file($imagen , $nombre_nuevo_con_carpeta);
  //de damos permisos 777
  chmod($nombre_nuevo_con_carpeta,0777);

  ///////////////////////////////////////////

El código lo he comentado lo mejor posible para que se pueda entender que hace cada línea. También, la consulta MySQL, osea, donde dice:

$insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos) VALUES (%s, %s)",

Se cambia por los siguiente:

// se agrega "archivo_archivos, extension_archivos y la fecha" a la consulta y dos extra %s separados por comas
  $insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos, archivo_archivos, extension_archivos, fecha_archivos) VALUES (%s, %s, %s, %s, NOW())",

Aquí hemos añadido los campos archivo_archivos, extension_archivos y fecha_archivos a la consulta, dos extra %s para que los valores del sprintf creado por DW correspondan con los campos agregados y también la función “NOW()” de MySQL para que se  inserte la fecha que cuando se subió el archivo. Por último, agregamos los dos valores al que correspondan con los campos en el sprintf. Después de:

GetSQLValueString($_POST['nombre'], "text")

Y antes del paréntesis y el punto y coma agregamos:

GetSQLValueString($nombre_nuevo, "text"),
GetSQLValueString($extension, "text")

El código completo del insert queda así:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {

  ////////////// Parte añadida 1 //////////////

  //carpteta donde vamos a guardar la imagen
  $carpeta = 'imagenes/';
  //recibimos el campo de imagen
  $imagen = $_FILES['imagen']['tmp_name'];
  //guardamos el nombre original de la imagen en una variable
  $nombrebre_orig = $_FILES['imagen']['name'];
  //el proximo codigo es para ver que extension es la imagen
  $array_nombre = explode('.',$nombrebre_orig);
  $cuenta_arr_nombre = count($array_nombre);
  $extension = strtolower($array_nombre[--$cuenta_arr_nombre]);
  //creamos nuevo nombre para que tenga nombre unico
  $nombre_nuevo = time().'_'.rand(0,100).'.'.$extension;
  //nombre nuevo con la carpeta
  $nombre_nuevo_con_carpeta = $carpeta.$nombre_nuevo;
  //por fin movemos el archivo a la carpeta de imagenes
  $mover_archivos = move_uploaded_file($imagen , $nombre_nuevo_con_carpeta);
  //de damos permisos 777
  chmod($nombre_nuevo_con_carpeta,0777);

  ///////////////////////////////////////////

   // se agrega "archivo_archivos, extension_archivos y la fecha" a la consulta y dos extra %s separados por comas
  $insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos, archivo_archivos, extension_archivos, fecha_archivos) VALUES (%s, %s, %s, %s, NOW())",
					   GetSQLValueString($_POST['tipo'], "text"),
					   GetSQLValueString($_POST['nombre'], "text"),
					   ////////////// Parte añadida //////////////
					   GetSQLValueString($nombre_nuevo, "text"),
					   GetSQLValueString($extension, "text"))
					   ///////////////////////////////////////////
					   ;

  mysql_select_db('NOMBRE DE TU DATABASE', 'NOMBRE DE TU CONNECCION AQUI');
  $Result1 = mysql_query($insertSQL, 'INCLUIR TU CONNECCION AQUI') or die(mysql_error());

}

Y listo. Una vez finalizado el sistema se le puede aplicar el HTML/CSS que sea necesario. Algo adicional (y muy recomendado) que podemos hacer es limitar los tipos de archivos que los usuarios van a subir para que solamente puedan subir imágenes. Esto lo podemos hacer creando un Array con los valores de las extensiones que son permitidas. De esa forma podremos comparar los valores del array con el archivo subido por el usuario. En este caso permitimos los siguientes archivos :jpg, jpeg, gif y png. Este es el array:

$archivos_disp_ar = array('jpg', 'jpeg', 'gif', 'png');

Validamos el tipo de archivo de esta forma:

//validamos la extension
if(!in_array($extension, $archivos_disp_ar)) $error = "Este tipo de archivo no es permitido";

Después usamos una condicional para ver si la variable $error está vacía o no. Al final el código queda así:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {

  ////////////// Parte añadida 1 //////////////
  //array de archivos disponibles
  $archivos_disp_ar = array('jpg', 'jpeg', 'gif', 'png');
  //carpteta donde vamos a guardar la imagen
  $carpeta = 'imagenes/';
  //recibimos el campo de imagen
  $imagen = $_FILES['imagen']['tmp_name'];
  //guardamos el nombre original de la imagen en una variable
  $nombrebre_orig = $_FILES['imagen']['name'];
  //el proximo codigo es para ver que extension es la imagen
  $array_nombre = explode('.',$nombrebre_orig);
  $cuenta_arr_nombre = count($array_nombre);
  $extension = strtolower($array_nombre[--$cuenta_arr_nombre]);

  //validamos la extension
  if(!in_array($extension, $archivos_disp_ar)) $error = "Este tipo de archivo no es permitido";

  if(empty($error)){

	  //creamos nuevo nombre para que tenga nombre unico
	  $nombre_nuevo = time().'_'.rand(0,100).'.'.$extension;
	  //nombre nuevo con la carpeta
	  $nombre_nuevo_con_carpeta = $carpeta.$nombre_nuevo;
	  //por fin movemos el archivo a la carpeta de imagenes
	  $mover_archivos = move_uploaded_file($imagen , $nombre_nuevo_con_carpeta);
	  //de damos permisos 777
	  chmod($nombre_nuevo_con_carpeta,0777);

	  ///////////////////////////////////////////

	   // se agrega "archivo_archivos, extension_archivos y la fecha" a la consulta y dos extra %s separados por comas
	  $insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos, archivo_archivos, extension_archivos, fecha_archivos) VALUES (%s, %s, %s, %s, NOW())",
						   GetSQLValueString($_POST['tipo'], "text"),
						   GetSQLValueString($_POST['nombre'], "text"),
						   ////////////// Parte añadida //////////////
						   GetSQLValueString($nombre_nuevo, "text"),
						   GetSQLValueString($extension, "text"))
						   ///////////////////////////////////////////
						   ;

	  mysql_select_db('NOMBRE DE TU DATABASE', 'NOMBRE DE TU CONNECCION AQUI');
	  $Result1 = mysql_query($insertSQL, 'INCLUIR TU CONNECCION AQUI') or die(mysql_error());
	}
}

Para mostrar el error cuando la condición se cumpla ponemos esto encima de la forma:

<?php if(!empty($error)) echo $error; ?>

El próximo tutorial relacionado a este será como borrar los records de la base de datos y las imágenes físicas.

Puedes ver la segunda parte de este artículo aquí

Be Sociable, Share!
  • Pingback: Gadget Newz

  • Pingback: Tweets that mention Como crear un sistema para subir imágenes usando Dreamweaver, PHP y MySQL « Blog de Juaniquillo -- Topsy.com

  • http://www.dsurfysnow.com/ Juan

    Hola A todos, un tutorial estupendo la verdad, gracias por el aporte.
    Una cuestión si quiero que además de insertar los datos en el servidor envien un mensaje a un correo para que haya constancia de la subida como tendría que hacer???

    Un saludo.

    • http://juaniquillo.com juaniquillo

      @juan Ya eso sería parte de otro tutorial ya que DW no tiene ninguna función que inserte el código para enviar mensajes por email.Yo ya tengo planeado hacer un tutorial de como enviar la información de un formulario por correo. Voy a tratar de terminarlo lo antes posible.
      Saludos.

      • http://ninguno pipe rodriguez

        Hola he estado bien el tutorial me parce muy bueno, me gusta aprender y desde hace dias vengo investigando sobre el envio de notificaciones o de un formulario al mail, por favor si me puedes ayudar o explicar como puedo hacer esto, es una gran inquietud que quiero solucionar.
        Gracias
        Cualquier cosa porfa escribeme ese es mi correo o a este ****@***.edu
        Gracias

        • http://juaniquillo.com juaniquillo

          Primero que nada, he quitado tu email para ya que se presta para que te hagan spam. Segundo, lo siento pero no doy consultas vía email. Lo que puedo hacer es agregar ese tutorial a la lista que pienso hacer, aunque la verdad es que ha existen unos muy buenos sobre eso. Sólo usa el termino “enviar un formulario por email php” en google y encontrarás algunos muy buenos.

  • Herzegon

    Gracias por el código, me funciono perfectamente!!!!!

  • Marco

    que es el 777 como permisos??

  • Marco

    estimados curiosos:
    Para que quieran ver imagen grande haciendo click sobre el imagen subida

    reemplazalo de:

    <img src="imagenes/” alt=”" height=”100″>

    por:

    <a href="imagenes/” alt=”" target=”_blank”><img src="imagenes/” alt=”" height=”100″>

    saludos
    MArco-Peru

    • http://juaniquillo.com juaniquillo

      @Marco: Este tutorial será expandido próximamente como he indicado. Incluiré como borrar las imágenes y como mostrarlas más grandes.;

  • jose

    buenas
    gracias por la informacion
    lo necesitava urgentemente

  • Pingback: Blog Peru - Resumen de la semana (jun 28 – jul 04, 2010)

  • Pingback: Blog Peru - Resumen (Sept 29 2010)

  • Manuel

    Hola que tal, tengo un problema voy siguiendo paso a paso el tuto pero llego a una parte en la que dice:

    “En este caso sólo hacemos coincidir dos de ellos: di_tipo = tipo y nombre_archivo = nombre. Los otros campos los agregaremos después de procesar la imagen”

    Aqui no entiendo porque en el formulario que se crea para subir las imagenes no hay ningun campo que se llame “tipo” asi que no se si se refiera a que tenga que cambiarle el nombre a alguno de los dos campos para podre relacionarlo, ya que en el ejemplo que me descargue tampoco viene ningun campo con ese nombre.

    Por favor si alguien me puede aclarar ese duda, de antemano gracias

    • http://juaniquillo.com juaniquillo

      No sé si viste que un poco más arriba mencioné esto:

      También he incluido un input oculto llamado “tipo”. No es algo que normalmente haga, pero esta vez he utilizado las mismas tablas MySQL que de otro post. De esa forma pudo usar una sola tabla de imágenes pero diferentes tipo. El archivo SQL lo he incluido en el archivo para descargar.

      Si no tienes un campo tipo en tu formulario y vas a usar otra tabla de tu base de datos y no la que yo uso puedes obviar el campo “tipo”

  • DAVID

    con que version de dreem lo trabajaste??????

    • http://juaniquillo.com juaniquillo

      Esta primera parte del artículo lo hice usando DWCS3. La segunda parte la hice usando DWCS5.

  • Javier Mosquera

    Tengo una duda. El tutorial empieza haciendo ese Query y de ahí salen muchos campos que no sé de dónde salieron:
    tipo_archivos, nombre_archivos, archivo_archivos, extension_archivos, fecha_archivos
    De dónde salieron esos y qué función cumplen. Son varchar? Alguna cantidad máxima de caracteres?

    • http://juaniquillo.com juaniquillo

      Podrías verificarlo en el archivo SQL adjunto, pero también te respondo aquí mismo. Estas son las dos tablas que creo para los archivos:

      --
      -- Table structure for table `archivos`
      --

      CREATE TABLE IF NOT EXISTS `archivos` (
      `id_archivos` int(11) NOT NULL auto_increment,
      `categoria_archivos` int(11) default NULL,
      `tipo_archivos` varchar(11) default NULL,
      `id_tipo_archivos` int(11) default NULL,
      `nombre_archivos` varchar(255) default NULL,
      `archivo_archivos` varchar(255) default NULL,
      `extension_archivos` varchar(255) default NULL,
      `portada_archivos` int(11) default NULL,
      `fecha_archivos` datetime default NULL,
      PRIMARY KEY (`id_archivos`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

      • ANTONIO_J_HP

        hola amigo yo también estoy usando este código para un proyecto de la universidad te voy a responder 7ya que yo tuve esa misma pregunta pero nunca la hice esos campos son los que uno utiliza mas este por lo menos nombre_archivos es el nombre que tu le das a tu foto encaso de que no se muestre la imagen en miniatura se mostrara el nombre que le colocaste, archivo_archivos es uno de los mas importantes ya que al tu guardar la foto ese campo le asigna un nombre y por medio de ese nombre la guarda y tu carpeta de imagenes y en la base de dato con ese nombre es que la base de dato la llama pana que se muestre, fecha_archivos toma la fecha y la hora en que tu subsstes la imagen se lo puedes ver en la base de dato

  • Edwin

    Genial tu aporte gracias por compartir tu conocimiento, me sirvio de maravilla para mi proyecto

  • carlos

    Un gran aporte funciona perfectamente.
    Ahora lo estudiare para agregarle mas datos al formulario exelente un 100%

  • luis

    hola una consulta cual seria los datos que tengo que cambiar en el codigo

    • http://juaniquillo.com juaniquillo

      Si sigues el tutorial te darás cuenta que es lo que tienes que cambiar.

  • angel

    amigo estoy usando ese codigo en un proyecto de la facultad mi servidor es linux fedora y dar permisos a la carpeta no es muy recomendable por cuestiones de seguridad, mi duda es como hacer para qe solo me guarde las imagenes en la base de datos sin qe se ballan a la carpeta asi ya no tendria problemas de los permisos a la carpeta.. gracias

    • http://juaniquillo.com juaniquillo

      Ese ya sería tema de otro tutorial. Si quieres puedes ver el el muy buen tutorial de Cluster en Foros del Web de como almacenar información binaria en una base de datos: http://goo.gl/ibc0u

  • http://xxxxxxxxxxx leo

    amigo me aparecen unos errores al enlazar el php con el sql me puedes ayudar
    ¿no hay que hacer coneccion con la base de datos?
    mysql_select_db(‘imagen’, ‘localhost’);
    $Result1 = mysql_query($insertSQL, ‘localhost’) or die(mysql_error());
    }
    }

    mysql_select_db(‘imagen’, ‘localhost’);
    $query_Recordset1 = “SELECT * FROM archivos WHERE tipo_archivos = ‘general’ ORDER BY fecha_archivos DESC”;

  • Marcelo

    Hola, quería saber qué cambios tendría que hacer para que no se me genere un nombre nuevo en el archivo_archivos, sino que se mantenga el nombre del archivo original. Es decir, si la imagen se llaman imagen1.jpg, me la suba a la carpeta con ese mismo nombre y no con otro numérico.
    Muchas gracias!

    • http://juaniquillo.com juaniquillo

      Sólo necesitas cambiar la linea:

      $mover_archivos = move_uploaded_file($imagen , $nombre_nuevo_con_carpeta);

      Por:

      $mover_archivos = move_uploaded_file($imagen , $_FILES['imagen']['name']);

      Después de eso no vas a necesitar las siguientes lineas:

      //creamos nuevo nombre para que tenga nombre unico
      $nombre_nuevo = time().'_'.rand(0,100).'.'.$extension;
      //nombre nuevo con la carpeta
      $nombre_nuevo_con_carpeta = $carpeta.$nombre_nuevo

      Solo tienes que tener cuidado que no subas archivos con el mismo nombre o el archivo nuevo “sobre-escribirá” (overwrite) el archivo antiguo.

      • Marcelo

        Gracias, me funcionó totalmente!

  • http://a9.freeconfigbox.com aerview

    Me encanto el ejemplo que das,voy a probar el archivo para ver que tal,quisiera preguntar otra cosa mas; como puedo hacer lo mismo pero en vez de una imagen que sea informacion,osea un sistema para que el usuario pueda subir su propia informacion y la pueda acomodar en donde el quiera por ejemplo,agradeceria mucho una respuesta muchas gracias.

    @aerview

    • http://juaniquillo.com juaniquillo

      Eso ya es un poco más específico. Tendrías que hacer unas áreas editables para que el usuario pueda subir imáagenes en partes del website y validar esas imágenes para que sean del tamaño apropiado.

  • Esteban

    Hola, primero que todo, gracias por el tutorial, muy bien explicado y comprensible, te comento que use parte de tu código en una aplicacion que estoy haciendo y te tengo la sieguente consulta con este trozo:

    if(!in_array($extension, $archivos_disp_ar)) $error = “Este tipo de archivo no es permitido”;

    if(empty($error)){

    el codigo me permite bloquear los archivos que no sean imagenes, no sube ni la foto ni rellena la bd, pero no me muestra el mensaje x ningun lado, que puede ser?

    gracias

    • http://juaniquillo.com juaniquillo

      No veo ninguna explicación para que eso pase. Com puees ver, esto en el demo funciona perfectamente. ¿Has hecho algún cambio al script?

  • Daniel

    La verdad que me gustaria juan que explicaras mejor como hacer la estructura bien del index.php ya que le faltaria la sintaxis de html mejor dicho su cabaera por favor si pudieras explicar mejor con la version en expañol de adobe porque la verdad no se entiende bien…..

    Saludos.

  • Daniel

    Mejor dicho lo que me parece es que faltan algunos archivos en tu
    archivo de tutorial de ayuda porque legalmente no entiendo bien este tutorial se montaran en un servidor de hosting o local ..

    Me gustaria que explicaras mejor si serias tan amable

    Saludos

    • http://juaniquillo.com juaniquillo

      La verdad es que no se a que te refieres. Que exactamente falta?
      Este es un tutorial sencillo que deberías poder ajustar a tus necesidades generales. Si necesita algo más específico la solución dependerá de lo que necesites.

  • http://.. rodrigo

    hola como hago para en ves de hacer un sistema para subir imagenes, hacer para subir archivos office?? o block de notas

    • http://juaniquillo.com juaniquillo

      Para eso usas una condicional que depende de la extensión del archivo. Si es doc o docx entonces solo necesitas poner el enlace al archivo para que pueda ser bajado.

  • Jonatan

    Hola! antes que nada muchas gracias por este tutorial.
    ahora, lo que no entiendo es que poner en los campos donde dice “aqui tu conexion” , “aqui el nombre de tu tabla” etc. Podrias ser mas especifico?
    yo tengo un hosting pago.
    muchas gracias

  • Jonatan

    MUCHISIMAS GRACIAS!
    no se mucho de php pero anduve toqueteando un poco y pude solucionarlo
    solo tuve que borrar el “” en index.php y borrar.php

    Lo que hice fue esto:
    en index.php
    eliminar la linea Nº 1 :”"
    y en su lugar colocar esto:

    $host_name = (‘localhost’);//Dirección del host
    $data_base_user = (‘root’);//Nombre del usuario de la base de datos
    $password_db = (”);//Contraseña de la base de datos
    $data_base_name = (‘subirimg’);//Nombre de la base de datos
    $conectar = mysql_connect ($host_name, $data_base_user, $password_db) or die (‘Imposible conectarse al servidor.’);

    y donde dice :
    mysql_select_db(‘TU_BASE_DE_DATOS_AQUI’, ‘TU_CONEXION_AQUI’);

    reemplazarlo por:
    mysql_select_db($data_base_name, $conectar);

    Luego buscamos donde dice:
    $Recordset1 = mysql_query($query_Recordset1, ‘TU CONEXION AQUI’) or die(mysql_error());

    y la reemplazamos por:
    $Recordset1 = mysql_query($query_Recordset1, $conectar) or die(mysql_error());

    hacer lo mismo con el archivo /include/borrar.php y listo! funciona perfectamente!

    espero que esto haya servido tambien. muchas gracias!

  • Rikochett

    Muy bueno el tutorial, el único problema que he tenido es que no supe qué colocar en estas líneas:

    mysql_select_db(‘NOMBRE DE TU DATABASE’, ‘NOMBRE DE TU CONNECCION AQUI’);
    $Result1 = mysql_query($insertSQL, ‘INCLUIR TU CONNECCION AQUI’) or die(mysql_error());
    }
    }
    mysql_select_db(‘NOMBRE DE TU DATABASE’, ‘NOMBRE DE TU CONNECCION AQUI’);
    $query_Recordset1 = “SELECT * FROM archivos WHERE tipo_archivos = ‘general’ ORDER BY fecha_archivos DESC”;
    $Recordset1 = mysql_query($query_Recordset1, ‘INCLUIR TU CONNECCION AQUI’) or die(mysql_error());

    ***************************

    Por más qu elo intenté, nada; un genuino desastre! :(

    Culpa mía, en todo caso!

    Espero me respondas y me orientes

    Saludos!

  • Rikochett

    Ah, por cierto, los parámetros de mi conexión son:

    # FileName=”Connection_php_mysql.htm”
    # Type=”MYSQL”
    # HTTP=”true”
    $hostname_imagen = “localhost”;
    $database_imagen = “subirimagenes”;
    $username_imagen = “root”;
    $password_imagen = “password”;
    $imagen = mysql_pconnect($hostname_imagen, $username_imagen, $password_imagen) or trigger_error(mysql_error(),E_USER_ERROR);

    Pero no he sabido qué reemplazar en donde están esas líneas de tu código.

    Saludos!

    • http://juaniquillo.com juaniquillo

      En esa parte necesitas poner las variables creadas por DW cuando haces la conexión. Solo busca el archivo de conexión y ahí verás dos variables:

      $database_NOMBRE_DE_TU_CONEXION
      $NOMBRE_DE_TU_CONEXION

      Por ejemplo, si tu conexión es “CONEXION_1″ las variables se llamarán:

      $database_CONEXION_1
      $CONEXION_1

      Esas son las variables que vas a usar. Si no has hecho la conexión puedes ver como hago una de ejemplo en este tutorial

      • Rikochett

        Amigo,

        de acuerdo a los parámetros dados por mi más arriba, he puesto las variables. Solo dime si está bien:
        ********************************************
        mysql_select_db(‘$database_imagen’, ‘$hostname_imagen’);
        $Result1 = mysql_query($insertSQL, ‘$imagen’) or die(mysql_error());
        }
        }
        mysql_select_db(‘$database_imagen’, ‘$hostname_imagen’);
        $query_Recordset1 = “SELECT * FROM archivos WHERE tipo_archivos = ‘general’ ORDER BY fecha_archivos DESC”;
        $Recordset1 = mysql_query($query_Recordset1, ‘$imagen’) or die(mysql_error());

        ***********************************

        Bueno, en todo caso me sigue saliendo error! :(

        Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\subir_imagenes\index.php on line 86

        Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\subir_imagenes\index.php on line 88

        ¿Qué estoy haciendo mal?

        Muy agradecido por tu ayuda!

        • http://juaniquillo.com juaniquillo

          Creo que el error es debido a que estás poniendo las variables entre comillas. Necesitas quitarle las comillas para que se lean como variables y no como “strings”

          • Rikochett

            ¡En efecto, era así! :)

            Pero … Uff!

            Cuando aplico subir la imagen desde el formulario, me vuelven a salir errores en los queries:

            Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\subir_imagenes\index.php on line 80

            Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\subir_imagenes\index.php on line 81

  • Rikochett

    justo donde está este par de líneas del código:

    mysql_select_db($database_imagen, $imagen);
    $Result1 = mysql_query($insertSQL, $imagen) or die(mysql_error());

    ¿Qué estoy haciendo mal ahora?

    • http://juaniquillo.com juaniquillo

      Lo que dice el error es que no estás usando una conexión. Creo que ahí usaste las variables que no son. Es difícil saber porque no sé cual es la variable de tu base de datos y tu variable de conexión.

  • Ricardo

    Buenisimo tutorial, el problema me surge cuando intento subir la imagen a mi hosting, como lo hago, porque solo me funciona en localhost, pero no se como hacer para que este online, alguna ayudita..

    Por sierto, primera vez que visitio tu web y me ha gustado mucho, la encontre en forosdelweb ;)

    • http://juaniquillo.com juaniquillo

      Saludos Ricardo. Puede ser que no le has dado los permisos de leer y escribir a la carpeta donde guardas las imágenes. Verifica que esa carpeta tenga permisos 777.

  • Jonatan

    hola Juaniquillo! tengo una idea y duda al mismo tiempo.. me gustaria que este mismo script pueda hacerle un rezize a la imagen y tambien crear subdirectorios, o sea, albumes.. como en facebook,picassa etc..
    desde ya gracias

    • http://juaniquillo.com juaniquillo

      La verdad es que nunca he intentado usar PHPImagen para hacer un rezise real de las imágenes así que no puedo opinar acerca de eso, aunque me imagino que se puede hacer. En cuanto a los folders, creo que lo mejor es usar folders virtuales. Necesitas añadir un campo a la base de datos donde añades a que folder pertenece, de esa forma puedes hacer una consulta que te devuelva todas las imágenes de ese folder específico. Desde hace ya tiempo he querido hacer un tutorial parecido (usando jquery para simular carpetas) pero creo que no podré hacerlo por un buen tiempo ya que en estos momentos tengo mucho trabajo.

  • andriu1419

    Excelente foro.. todo funciona de maravilaaa… gracias… :)

  • http://host3.webcindario.com nagera

    hola juaniquillo, saludos, me parece muy bien tu tecnologia para subir imagenes con php, me podrias ayudar con esto :

    Warning: chmod() [function.chmod]: No error in C:\AppServ\www\subir_imagenes2\index.php on line 54

  • http://periodistas.webcindario.com nagera

    que hay juaniquillo, saludos “again” pues resulta que ya me jalo la aplicacion de subir fotos o imagenes con dw , ahora cuando incerto el codigo para validar los archivos de imagen, la instruccion array mejor dicho me manda error , pero sin esta instruccion “array” tambien trabaja la aplicacion, solo que es necesario incertar la instruccion o prametro del array para evitar suban cualquier clase de archivo,

  • Kevinrivera

    se abre la evnatna me permite seleccionar la imagen y si cuadno voy a la carpata efectivamente si la guardo pero nose guarda ninguna informacion en la base de datos me sale este error
    Fatal error: Call to undefined function get_magic_quotes_gpc() in C:AppServwwwSuccessSheetindex.php on line 6

    • Anónimo

      Al parecer tienes instalada una versión una versión bastante nueva de PHP. En tu caso puedes comentar la siguiente linea en el archivo index.php de esta forma. La linea número 6 que dice:

      $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

      La comentas así:

      //$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

      Eso debe resolver ese error.

      • Kevinrivera

        nada compa en el codigo dice q menor que la version 6 la mia es 5.2.6 osea no tendria q tener erros hay igual la comente y como si nada ese no es el problema si tienes algun otro consejo en vdd te lo agradeceria estoy corriendo con esto q es para un proyecto de la universidad

        • Anónimo

          Verifica la ruta de la imagen, osea, el src. Puede que tengas un problema con la librería que crea los thumbnails.

          • Kevinrivera

            0) { // Show if recordset not empty ?>

            <img src="imagenes/” alt=”" width=”100″ height=”100″ align=”middle”>

             

            no encuentro cual puede ser el error

          • Kevinrivera

            <img src="imagenes/”
            width=”100″ height=”100″ align=”middle”>

          • Kevinrivera

            <img src="imagenes/”
            alt=”"
            width=”100″ height=”100″ align=”middle”>

            perdon por los otros comentarios este si es el codigo q tengo pero no me muestra la imagen si ves algo irregular te agradeceria

      • Kevinrivera

        ya no me sale ese error ya puedo cargar iagen guarda al info en la base de datos pero no me deja ver la imagen q carge en pantalla me sale es un icono de imagen rota

  • Kevinrivera

     

    0) { // Show if recordset not empty ?>

    <img src="imagenes/” alt=”" height=”100″>

     
    que error hay? no me muestra la imagen

    • Anónimo

      Por lo que veo no estás recibiendo información de tu base de datos. Revisa la información de tu conexión de tu conexión y de la base de datos. También revisa si la información se está alamacenando en tu base de datos.

      • Kevinrivera

        si guarda informacion en la base de datos lo que veo es q no me kiere leer informacion de la base de datos nose xq

        • Anónimo

          Entoces quiere decir que tu conexión funciona bien. Revisa el recordset que busca la informacion en la base de datos.

  • alex

    muy bueno el tutorial… en unos dias te escribo de nuevo para consultarte unas cosas estoy con un problemas similar. gracias

  • El_kumanes1

    el codigo me funcione perfecto pero no se ve la imagen miniatura esa que hay que modificar para que se vea 

    • juaniquillo

      verifica en el source del navegador si se estan pasando las variables al tag de imagen, ejemplo:

      las variables file, ancho, alto y cut no pueden estar vacías. si eso no pasa entonces ve la pagina directamente, en este caso:

      “img.php?file=../subir_imagenes/imagenes/1335194861_52.png&ancho=100&alto=75&cut”

      y mira si te da algún error PHP

  • El_kumanes1

    ya vi otro error bueno no se si es error pero cada vez que refresca la pagina se sube una foto 

    • juaniquillo

      Podría ser un algo no deseado por tí. Ya los navegadores te avisan cuando estás haciendo un post doble, pero si necesitas que el post no se incluya en el refresh necesitas enviar al usuario a otra página una vez se complete la entrada a la base de datos. Esto lo puedes hacer fácilmente con PHP usando un “header()”

  • El_kumanes1

    tengo todo eso bien mira te dejo el codigo aver que puede ser

    <a href="imagenes/” class=”imagen_grande”><img src="img.php?file=imagenes/&ancho=100&alto=75&cut” alt=”" height=”100″ width=”75″>
         <a href="include/borrar.php?id=” 

    • juaniquillo

      Por lo que veo no se esta pasando el nombre de la imagen al source:

      img.php?file=imagenes/la_imagen_aqui.jpg&ancho=100&alto=75&cut
      Revisa el que el siguiente recordset:

      $query_Recordset1 = “SELECT * FROM archivos WHERE tipo_archivos = ‘general’ ORDER BY fecha_archivos DESC”;

      esté devolviendo las imágenes que están en al base de datos

  • Mario_007

    Hola, Leí tu artícullo sobre como subir imagenes y quisiera preguntarte que puedo hacer si tengo un archivo de correo HTML y quisiera agregar fotos dentro del mismo para que al mismo tiempo que reciba los datos también reciba las imágenes.

    GRACIAS por tu atención