Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Galería de fotos en php

Estas en el tema de Galería de fotos en php en el foro de PHP en Foros del Web. Quiero compartir con ustedes esta galería de fotos que estuve haciendo, soy nuevo en php y leyendo un poco aquí y allá pude obtener el ...
  #1 (permalink)  
Antiguo 12/07/2013, 07:16
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Galería de fotos en php

Quiero compartir con ustedes esta galería de fotos que estuve haciendo, soy nuevo en php y leyendo un poco aquí y allá pude obtener el siguiente código:

Formulario de envío:

Código:
<!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>Envía tu foto</title>
</head>

<body>
<form action="enviar.php" method="post" enctype="multipart/form-data" name="formulario" id="formulario">
  <p>
    <label>Ingresa tu correo electrónico:
      <input type="text" name="correo_electronico" id="correo_electronico" />
    </label>
  </p>
  <p>
    <label>Selecciona la foto:
      <input type="file" name="foto" id="foto" />
    </label>
  </p>
  <p>
      <input type="submit" name="enviar" id="enviar" value="Enviar" />
  </p>
</form>
</body>
</html>
Archivo php:

Código:
<?php
// Base de datos:
// Definimos la variable y realizamos la conexión con la base de datos:
$conexion = mysql_connect('localhost', 'root', '') or die('Error al conectar con la base de datos.');
// Definimos la variable y seleccionamos la base de datos a ser utilizada:
$basededatos = mysql_select_db('galeria', $conexion) or die('La base de datos seleccionada no existe.');
// Definimos la variable y seleccionamos la tabla para generar el nombre de la foto:
$nombreid = mysql_query("SELECT * FROM fotos WHERE id ORDER BY id desc LIMIT 1");
// Fin base de datos

// Correo electrónico:
// Definimos la variable para el correo electrónico:
$correo_electronico = $_POST['correo_electronico'];
// Fin correo electrónico

// Foto:
// Definimos las variables para la foto:
$directorio = 'fotos';
$fila = mysql_fetch_array($nombreid);
$id = $fila['id'];
$nombre = "chica_dosual.net_".$id.".jpg";
$tipo = $_FILES['foto']['type'];
$rutatemporal = $_FILES['foto']['tmp_name'];
$tamaño = $_FILES['foto']['size'];
$rutafinal = $directorio.'/'.$nombre;

if ($_POST['enviar']) {
if ($tipo == "image/jpeg") {
if ($tamaño <= 2000000) {

// Movemos la foto al directorio de destino:
move_uploaded_file($rutatemporal, $rutafinal);

}else{
echo ("No cargue esta página directamente.");
}
}else{
echo ("Sólo se pueden enviar fotos en formato JPG.");
}
}else{
echo ("La foto supera el tamaño máximo permitido.");
}


// Fin foto

// Miniatura:
// Definimos las variables para la reación de la miniatura:
$rutaminiatura = $rutafinal;
$directoriominiatura = "fotos/miniaturas/miniatura_".$nombre;
$anchominiatura = 150;
$altominiatura = 150;
// Creamos el lienzo de la foto:
$miniatura = imagecreatetruecolor($anchominiatura, $altominiatura);
$fotominiatura = imagecreatefromjpeg($rutafinal);
// Obtenemos las dimensiones de la foto original:
$tamañominiatura = getimagesize($rutaminiatura);
$ancho_inicial = $tamañominiatura[0];
$alto_inicial = $tamañominiatura[1];
// Tomamos el lado más grande de la foto para tener una miniatura cuadrada:
$lado = $ancho_inicial > $alto_inicial ? $alto_inicial : $ancho_inicial;
// Creamos la miniatura en base a la foto original:
imagecopyresampled($miniatura, $fotominiatura, 0, 0, 0, 0, $anchominiatura, $altominiatura, $lado, $lado);
// Guardamos la foto en miniatura con una calidad de 100%:
imagejpeg($miniatura, $directoriominiatura, 100);
// Fin miniatura

// Marca de agua:
// Definimos las variables para la marca de agua:
$rutamarcadeagua = 'imagenes/marca_de_agua.png';
$marcadeagua = imagecreatefrompng($rutamarcadeagua);
// Procedemos a crear el fichero JPEG final con la marca de agua a partir de la foto inicial:
$rutafoto = $directorio . '/' . $nombre;
$foto = imagecreatefromjpeg($rutafoto);
// Obtenemos las dimensiones de la foto y de la marca de agua:
$tamañofoto = getimagesize($rutafoto);
$tamañomarca = getimagesize($rutamarcadeagua);
$destino_x = $tamañofoto[0] - $tamañomarca[0] - 10;
$destino_y = $tamañofoto[1] - $tamañomarca[1] - 10;
// Pegamos la foto con la marca de agua:
imagecopymerge($foto, $marcadeagua, $destino_x, $destino_y, 0, 0,$tamañomarca[0], $tamañomarca[1], 100);
// Guardamos los cambios:
imagejpeg($foto, $rutafoto);
// Liberamos la memoria:
imagedestroy($foto);
imagedestroy($marcadeagua);
// Fin marca de agua

// Construimos la cadena SQL para guardar los datos:
$sql = "INSERT INTO fotos (url,correo_electronico) values('" . $rutafinal . "','" . $correo_electronico . "')";

// Informamos el resultado de la operación:
$respuesta = mysql_query($sql, $conexion);
if ($respuesta) {
    echo 'La foto ha sido enviada correctamente.';
} else {
    echo 'Error al enviar la foto.';
}

?>
Estaría muy agradecido si me ayudan a mejorar el código y hacerlo mas seguro, ademas de seguro que se me pasaron algunos detalles que ustedes como profesionales podrían notarlo. Muchas gracias.
  #2 (permalink)  
Antiguo 12/07/2013, 08:00
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

De forma superficial ya que cuesta leer el código como lo has dejado (usa highlight para mostrar código y no sangrar los ojos >.<), en fin, no debes confiar en la propiedad "type" del super array $_FILES, ya que este es entregado por el navegador y no directamente del archivo, por lo cual puede ser fácilmente manipulable ya que con solo cambiar la extensión del archivo puede pasar de ser un exe a una imagen y el "type" te indicara que realmente es una imagen cuando no lo es, para validar imágenes es mejor usar getimagesize() el cual te entregará una serie de parámetros si el archivo que le pasas es una imagen, si es otro tipo de archivo no retornará nada, así te aseguras que es una imagen y no otro archivo con la extensión cambiada....

por ultimo, veo que haces un insert en tu db y veo que haces uso de la variable $correo_electronico, pero en ningún otro lado veo que definas dicha variable, quiero suponer que NO ESTAS USANDO registre_globals en ON, porque para comenzar eso da un tremendo agujero de seguridad y segundo, la mayoría (si o es que deberían ser todos) de los hosting tienen deshabilitada dicha opción por lo mismo de que genera problemas de seguridad, por lo cual te puede acarrear problemas de compatibilidad si cambias de hosting...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #3 (permalink)  
Antiguo 12/07/2013, 08:12
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Gracias por las sugerencias, las voy a poner en practica!!! :)
  #4 (permalink)  
Antiguo 12/07/2013, 08:17
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Ah por cierto, la variable correo electrónico esta definida mas arriba, teniendo en cuenta el orden del formulario (es algo personal, se me hace mas fácil entender el proceso).
  #5 (permalink)  
Antiguo 12/07/2013, 08:24
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Segun tu segerencia entonces quedarìa de esta manera??? corrigeme si me equivoco por favor.

Código PHP:
Ver original
  1. <?php
  2. // Base de datos:
  3. // Definimos la variable y realizamos la conexión con la base de datos:
  4. $conexion = mysql_connect('localhost', 'root', '') or die('Error al conectar con la base de datos.');
  5. // Definimos la variable y seleccionamos la base de datos a ser utilizada:
  6. $basededatos = mysql_select_db('galeria', $conexion) or die('La base de datos seleccionada no existe.');
  7. // Definimos la variable y seleccionamos la tabla para generar el nombre de la foto:
  8. $nombreid = mysql_query("SELECT * FROM fotos WHERE id ORDER BY id desc LIMIT 1");
  9. // Fin base de datos
  10.  
  11. // Correo electrónico:
  12. // Definimos la variable para el correo electrónico:
  13. $correo_electronico = $_POST['correo_electronico'];
  14. // Fin correo electrónico
  15.  
  16. // Foto:
  17. // Definimos las variables para la foto:
  18. $directorio = 'fotos';
  19. $fila = mysql_fetch_array($nombreid);
  20. $id = $fila['id'];
  21. $nombre = "chica_dosual.net_".$id.".jpg";
  22. $rutatemporal = $_FILES['foto']['tmp_name'];
  23. $tipo = getimagesize($rutatemporal);
  24. $tamaño = $_FILES['foto']['size'];
  25. $rutafinal = $directorio.'/'.$nombre;
  26.  
  27. if ($_POST['enviar']) {
  28. if ($tipo == "image/jpeg") {
  29. if ($tamaño <= 2000000) {
  30.  
  31. // Movemos la foto al directorio de destino:
  32. move_uploaded_file($rutatemporal, $rutafinal);
  33.  
  34. }else{
  35. echo ("No cargue esta página directamente.");
  36. }
  37. }else{
  38. echo ("Sólo se pueden enviar fotos en formato JPG.");
  39. }
  40. }else{
  41. echo ("La foto supera el tamaño máximo permitido.");
  42. }
  43.  
  44.  
  45. // Fin foto
  46.  
  47. // Miniatura:
  48. // Definimos las variables para la reación de la miniatura:
  49. $rutaminiatura = $rutafinal;
  50. $directoriominiatura = "fotos/miniaturas/miniatura_".$nombre;
  51. $anchominiatura = 150;
  52. $altominiatura = 150;
  53. // Creamos el lienzo de la foto:
  54. $miniatura = imagecreatetruecolor($anchominiatura, $altominiatura);
  55. $fotominiatura = imagecreatefromjpeg($rutafinal);
  56. // Obtenemos las dimensiones de la foto original:
  57. $tamañominiatura = getimagesize($rutaminiatura);
  58. $ancho_inicial = $tamañominiatura[0];
  59. $alto_inicial = $tamañominiatura[1];
  60. // Tomamos el lado más grande de la foto para tener una miniatura cuadrada:
  61. $lado = $ancho_inicial > $alto_inicial ? $alto_inicial : $ancho_inicial;
  62. // Creamos la miniatura en base a la foto original:
  63. imagecopyresampled($miniatura, $fotominiatura, 0, 0, 0, 0, $anchominiatura, $altominiatura, $lado, $lado);
  64. // Guardamos la foto en miniatura con una calidad de 100%:
  65. imagejpeg($miniatura, $directoriominiatura, 100);
  66. // Fin miniatura
  67.  
  68. // Marca de agua:
  69. // Definimos las variables para la marca de agua:
  70. $rutamarcadeagua = 'imagenes/marca_de_agua.png';
  71. $marcadeagua = imagecreatefrompng($rutamarcadeagua);
  72. // Procedemos a crear el fichero JPEG final con la marca de agua a partir de la foto inicial:
  73. $rutafoto = $directorio . '/' . $nombre;
  74. $foto = imagecreatefromjpeg($rutafoto);
  75. // Obtenemos las dimensiones de la foto y de la marca de agua:
  76. $tamañofoto = getimagesize($rutafoto);
  77. $tamañomarca = getimagesize($rutamarcadeagua);
  78. $destino_x = $tamañofoto[0] - $tamañomarca[0] - 10;
  79. $destino_y = $tamañofoto[1] - $tamañomarca[1] - 10;
  80. // Pegamos la foto con la marca de agua:
  81. imagecopymerge($foto, $marcadeagua, $destino_x, $destino_y, 0, 0,$tamañomarca[0], $tamañomarca[1], 100);
  82. // Guardamos los cambios:
  83. imagejpeg($foto, $rutafoto);
  84. // Liberamos la memoria:
  85. imagedestroy($foto);
  86. imagedestroy($marcadeagua);
  87. // Fin marca de agua
  88.  
  89. // Construimos la cadena SQL para guardar los datos:
  90. $sql = "INSERT INTO fotos (url,correo_electronico) values('" . $rutafinal . "','" . $correo_electronico . "')";
  91.  
  92. // Informamos el resultado de la operación:
  93. $respuesta = mysql_query($sql, $conexion);
  94. if ($respuesta) {
  95.     echo 'La foto ha sido enviada correctamente.';
  96. } else {
  97.     echo 'Error al enviar la foto.';
  98. }
  99.  
  100. ?>
  #6 (permalink)  
Antiguo 12/07/2013, 08:56
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Pues no, esta mal implementado, getimagesize() entrega un array con varios parámetros, de hecho por eso mismo te dejé el link a la documentación de la función, en fin, los parámetros que retorna son

- Ancho (width)
- Alto (height)
- Tipo (mime)
- Atributos

El que interesa es el tipo, con este obtienes la misma información que da "type" del super array $_FILES, pero con getimagesize() te aseguras que realmente es una imagen, la forma correcta de usar es...
Código PHP:
Ver original
  1. <?php
  2. $infoImage = getimagesize($_FILES['foto']['tmp_name']);
  3.  
  4. if (isset($infoImage['mime']) && $infoImage['mime'] == 'image/jpeg') {
  5.      echo 'Es una imagen jpg';
  6. }else {
  7.      echo 'No es una imagen!';
  8. }

También puedes hacer un print_r(getimagesize($_FILES['foto']['tmp_name'])) para ver toda la info que arroja dicha función...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #7 (permalink)  
Antiguo 12/07/2013, 09:01
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Wow vaya... gracias por explicarme... ahora lo comprendo mucho mejor :)
  #8 (permalink)  
Antiguo 12/07/2013, 09:15
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

En cuanto a la verificación del tamaño esta bien en la manera en que lo hice? o existe otra manera mejor de hacerlo? y en caso e que no se cumplan esos requisitos, como puedo terminar todo el proceso en ese mismo punto?
  #9 (permalink)  
Antiguo 12/07/2013, 09:20
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Con lo del tamaño esta bien, de hecho, no existe otra forma, solo ten en cuenta que el tamaño es enviado en bytes, con respecto a terminar el proceso si alguna validación no se pasa siempre puedes recurrir a un die() o exit() según te convenga, así detienes el script en ese punto y no se ejecuta el código siguiente...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #10 (permalink)  
Antiguo 12/07/2013, 09:30
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Entonces lo mejor para terminar el proceso en ese punto seria hacer esto?

Código PHP:
Ver original
  1. <?php
  2. $infoImage = getimagesize($_FILES['foto']['tmp_name']);
  3.  
  4. if (isset($infoImage['mime']) && $infoImage['mime'] == 'image/jpeg') {
  5.      echo 'Es una imagen jpg';
  6. }else {
  7.      or die 'No es una imagen!';
  8. }
  #11 (permalink)  
Antiguo 12/07/2013, 09:42
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

El "or" esta de más, solo se usa en conjunto de una función que devuelva un valor booleano...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #12 (permalink)  
Antiguo 12/07/2013, 09:44
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Gracias amigo! :) estaré probando el script a ver como va funcionando con las mejoras que me ayudaste a hacer! ;)
  #13 (permalink)  
Antiguo 12/07/2013, 10:03
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Me he percatado de una cosa mas, en caso de que el usuario no seleccione una foto desde el formulario pero este le de click al boton enviar, como puedo dar un mensaje? podrais ayudarme con eso por favor?
  #14 (permalink)  
Antiguo 12/07/2013, 10:07
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Código PHP:
Ver original
  1. <?php
  2.  
  3. if (empty($_FILE['foto'])) {
  4.      die('Debes indicar una foto a subir!');
  5. }
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #15 (permalink)  
Antiguo 12/07/2013, 10:09
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Gracias!!!
  #16 (permalink)  
Antiguo 12/07/2013, 10:30
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Tengo una duda, estuve probando el sistema, para ver si los arreglos de seguridad que le hicimos funciona, y me doy cuenta de que solo salta el mensaje de que el archivo solo tiene que ser jpg, por mas de que haya cargado un archivo que supere el limite o una rchivo que haya cambiado de extension, tambien sale el mismo mensaje al no seleccionar ningun archivo y hacer clic en enviar, despues de todo el arreglo que hicimos el codigo quedo de esta manera:

Código PHP:
Ver original
  1. <?php
  2. // Base de datos:
  3. // Definimos la variable y realizamos la conexión con la base de datos:
  4. $conexion = mysql_connect('localhost', 'root', '') or die('Error al conectar con la base de datos.');
  5. // Definimos la variable y seleccionamos la base de datos a ser utilizada:
  6. $basededatos = mysql_select_db('galeria', $conexion) or die('La base de datos seleccionada no existe.');
  7. // Definimos la variable y seleccionamos la tabla para generar el nombre de la foto:
  8. $nombreid = mysql_query("SELECT * FROM fotos WHERE id ORDER BY id desc LIMIT 1");
  9. // Fin base de datos
  10.  
  11. // Correo electrónico:
  12. // Definimos la variable para el correo electrónico:
  13. $correo_electronico = $_POST['correo_electronico'];
  14. // Fin correo electrónico
  15.  
  16. // Foto:
  17. // Definimos las variables para la foto:
  18. $directorio = 'fotos';
  19. $fila = mysql_fetch_array($nombreid);
  20. $id = $fila['id'];
  21. $nombre = "chica_dosual.net_".$id.".jpg";
  22. $tipo = getimagesize($_FILES['foto']['tmp_name']);
  23. $rutatemporal = $_FILES['foto']['tmp_name'];
  24. $tamaño = $_FILES['foto']['size'];
  25. $rutafinal = $directorio.'/'.$nombre;
  26. // Comprobamos que el tipo y el tamaño de la foto sean los correctos:
  27. if ($_POST['enviar']) {
  28. if (empty($_FILES['foto'])) {
  29. die ("Seleccione la foto que desea enviar.");
  30. }
  31. if (isset($tipo['mime']) && $tipo['mime'] == "image/jpeg") {
  32. if ($tamaño <= 2500000) {
  33. // Movemos la foto al directorio de destino:
  34. move_uploaded_file($rutatemporal, $rutafinal);
  35. // Si la foto no cumple los requisitos, mostramos los mensajes:
  36. }else{
  37. die ("No cargue esta página directamente.");
  38. }
  39. }else{
  40. die ("Sólo se pueden enviar fotos en formato JPG.");
  41. }
  42. }else{
  43. die ("La foto supera el tamaño máximo permitido.");
  44. }
  45. // Fin foto
  46.  
  47. // Miniatura:
  48. // Definimos las variables para la reación de la miniatura:
  49. $rutaminiatura = $rutafinal;
  50. $directoriominiatura = "fotos/miniaturas/miniatura_".$nombre;
  51. $anchominiatura = 150;
  52. $altominiatura = 150;
  53. // Creamos el lienzo de la foto:
  54. $miniatura = imagecreatetruecolor($anchominiatura, $altominiatura);
  55. $fotominiatura = imagecreatefromjpeg($rutafinal);
  56. // Obtenemos las dimensiones de la foto original:
  57. $tamañominiatura = getimagesize($rutaminiatura);
  58. $ancho_inicial = $tamañominiatura[0];
  59. $alto_inicial = $tamañominiatura[1];
  60. // Tomamos el lado más grande de la foto para tener una miniatura cuadrada:
  61. $lado = $ancho_inicial > $alto_inicial ? $alto_inicial : $ancho_inicial;
  62. // Creamos la miniatura en base a la foto original:
  63. imagecopyresampled($miniatura, $fotominiatura, 0, 0, 0, 0, $anchominiatura, $altominiatura, $lado, $lado);
  64. // Guardamos la foto en miniatura con una calidad de 100%:
  65. imagejpeg($miniatura, $directoriominiatura, 100);
  66. // Fin miniatura
  67.  
  68. // Marca de agua:
  69. // Definimos las variables para la marca de agua:
  70. $rutamarcadeagua = 'imagenes/marca_de_agua.png';
  71. $marcadeagua = imagecreatefrompng($rutamarcadeagua);
  72. // Procedemos a crear el fichero JPEG final con la marca de agua a partir de la foto inicial:
  73. $rutafoto = $directorio . '/' . $nombre;
  74. $foto = imagecreatefromjpeg($rutafoto);
  75. // Obtenemos las dimensiones de la foto y de la marca de agua:
  76. $tamañofoto = getimagesize($rutafoto);
  77. $tamañomarca = getimagesize($rutamarcadeagua);
  78. $destino_x = $tamañofoto[0] - $tamañomarca[0] - 10;
  79. $destino_y = $tamañofoto[1] - $tamañomarca[1] - 10;
  80. // Pegamos la foto con la marca de agua:
  81. imagecopymerge($foto, $marcadeagua, $destino_x, $destino_y, 0, 0,$tamañomarca[0], $tamañomarca[1], 100);
  82. // Guardamos los cambios:
  83. imagejpeg($foto, $rutafoto);
  84. // Liberamos la memoria:
  85. imagedestroy($foto);
  86. imagedestroy($marcadeagua);
  87. // Fin marca de agua
  88.  
  89. // Construimos la cadena SQL para guardar los datos:
  90. $sql = "INSERT INTO fotos (url,correo_electronico) values('" . $rutafinal . "','" . $correo_electronico . "')";
  91.  
  92. // Informamos el resultado de la operación:
  93. $respuesta = mysql_query($sql, $conexion);
  94. if ($respuesta) {
  95.     echo 'La foto ha sido enviada correctamente.';
  96. } else {
  97.     echo 'Error al enviar la foto.';
  98. }
  99.  
  100. ?>

Cual podria ser la causa de ese pequeño error?
  #17 (permalink)  
Antiguo 12/07/2013, 12:43
Avatar de Rodrigo_01  
Fecha de Ingreso: enero-2005
Mensajes: 61
Antigüedad: 19 años, 10 meses
Puntos: 6
Respuesta: Galería de fotos en php

en esta parte de la linea

if (isset($tipo['mime']) && $tipo['mime'] == "image/jpeg")

cambialo a

if (isset($tipo['mime']) && $tipo['mime'] == "image/jpg")
  #18 (permalink)  
Antiguo 12/07/2013, 14:57
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Que efecto tendría ese cambio amigo?
  #19 (permalink)  
Antiguo 12/07/2013, 15:46
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Te dejo este código, funciona y hace las validaciones pertinentes, solo que eh comentado mucho de tu código, solo es quitar los /* y */ para que funcione correctamente!

Código PHP:
Ver original
  1. <?php
  2. if (isset($_POST['correo_electronico'])) {
  3.     /*
  4.     // Base de datos:
  5.     // Definimos la variable y realizamos la conexión con la base de datos:
  6.     $conexion = mysql_connect('localhost', 'root', '') or die('Error al conectar con la base de datos.');
  7.     // Definimos la variable y seleccionamos la base de datos a ser utilizada:
  8.     $basededatos = mysql_select_db('galeria', $conexion) or die('La base de datos seleccionada no existe.');
  9.     // Definimos la variable y seleccionamos la tabla para generar el nombre de la foto:
  10.     $nombreid = mysql_query("SELECT * FROM fotos WHERE id ORDER BY id desc LIMIT 1");
  11.     // Fin base de datos
  12.      */
  13.     // Correo electrónico:
  14.     // Definimos la variable para el correo electrónico:
  15.     $correo_electronico = $_POST['correo_electronico'];
  16.     // Fin correo electrónico
  17.  
  18.     if (empty($_FILES['foto']['name'])) {
  19.         die('Debes seleccionar una imagen!');
  20.     }
  21.  
  22.     $error = false;
  23.  
  24.     $infoImage = getimagesize($_FILES['foto']['tmp_name']);
  25.  
  26.     if ($infoImage['mime'] != 'image/jpeg') {
  27.         echo 'Solo puedes subir imagenes JPG';
  28.         $error = true;
  29.     }
  30.  
  31.     $pesoMaximo = 250000;
  32.     if ($_FILES['foto']['size'] > $pesoMaximo) {
  33.         echo 'No puedes subir imagenes mayores a '.ceil($pesoMaximo / 1024).' kb';
  34.         $error = true;
  35.     }
  36.  
  37.     if (!filter_var($_POST['correo_electronico'], FILTER_VALIDATE_EMAIL)) {
  38.         echo 'Debes indicar un email valido!';
  39.         $error = true;
  40.     }
  41.  
  42.     if (!$error) {
  43.         /*
  44.         // Foto:
  45.         // Definimos las variables para la foto:
  46.         $directorio = 'fotos';
  47.         $fila = mysql_fetch_array($nombreid);
  48.         $id = $fila['id'];
  49.         $nombre = "chica_dosual.net_".$id.".jpg";
  50.         $tipo = getimagesize($_FILES['foto']['tmp_name']);
  51.         $rutatemporal = $_FILES['foto']['tmp_name'];
  52.         $tamaño = $_FILES['foto']['size'];
  53.         $rutafinal = $directorio.'/'.$nombre;
  54.  
  55.         if (!move_uploaded_file($rutatemporal, $rutafinal)) {
  56.             echo 'No se pudo mover la imagen a su destino final!';
  57.         }
  58.  
  59.         // Miniatura:
  60.         // Definimos las variables para la reación de la miniatura:
  61.         $rutaminiatura = $rutafinal;
  62.         $directoriominiatura = "fotos/miniaturas/miniatura_".$nombre;
  63.         $anchominiatura = 150;
  64.         $altominiatura = 150;
  65.         // Creamos el lienzo de la foto:
  66.         $miniatura = imagecreatetruecolor($anchominiatura, $altominiatura);
  67.         $fotominiatura = imagecreatefromjpeg($rutafinal);
  68.         // Obtenemos las dimensiones de la foto original:
  69.         $tamañominiatura = getimagesize($rutaminiatura);
  70.         $ancho_inicial = $tamañominiatura[0];
  71.         $alto_inicial = $tamañominiatura[1];
  72.         // Tomamos el lado más grande de la foto para tener una miniatura cuadrada:
  73.         $lado = $ancho_inicial > $alto_inicial ? $alto_inicial : $ancho_inicial;
  74.         // Creamos la miniatura en base a la foto original:
  75.         imagecopyresampled($miniatura, $fotominiatura, 0, 0, 0, 0, $anchominiatura, $altominiatura, $lado, $lado);
  76.         // Guardamos la foto en miniatura con una calidad de 100%:
  77.         imagejpeg($miniatura, $directoriominiatura, 100);
  78.         // Fin miniatura
  79.  
  80.         // Marca de agua:
  81.         // Definimos las variables para la marca de agua:
  82.         $rutamarcadeagua = 'imagenes/marca_de_agua.png';
  83.         $marcadeagua = imagecreatefrompng($rutamarcadeagua);
  84.         // Procedemos a crear el fichero JPEG final con la marca de agua a partir de la foto inicial:
  85.         $rutafoto = $directorio . '/' . $nombre;
  86.         $foto = imagecreatefromjpeg($rutafoto);
  87.         // Obtenemos las dimensiones de la foto y de la marca de agua:
  88.         $tamañofoto = getimagesize($rutafoto);
  89.         $tamañomarca = getimagesize($rutamarcadeagua);
  90.         $destino_x = $tamañofoto[0] - $tamañomarca[0] - 10;
  91.         $destino_y = $tamañofoto[1] - $tamañomarca[1] - 10;
  92.         // Pegamos la foto con la marca de agua:
  93.         imagecopymerge($foto, $marcadeagua, $destino_x, $destino_y, 0, 0,$tamañomarca[0], $tamañomarca[1], 100);
  94.         // Guardamos los cambios:
  95.         imagejpeg($foto, $rutafoto);
  96.         // Liberamos la memoria:
  97.         imagedestroy($foto);
  98.         imagedestroy($marcadeagua);
  99.         // Fin marca de agua
  100.        
  101.         // Construimos la cadena SQL para guardar los datos:
  102.         $sql = "INSERT INTO fotos (url,correo_electronico) values('" . $rutafinal . "','" . $correo_electronico . "')";
  103.          
  104.         // Informamos el resultado de la operación:
  105.         $respuesta = mysql_query($sql, $conexion);
  106.         if ($respuesta) {
  107.             echo 'La foto ha sido enviada correctamente.';
  108.         } else {
  109.             echo 'Error al enviar la foto.';
  110.         }
  111.         */
  112.     }
  113. }
  114. ?>
  115. <!doctype html>
  116. <html lang="en">
  117. <head>
  118.     <meta charset="UTF-8">
  119.     <title>Document</title>
  120. </head>
  121. <body>
  122.     <form action="" method="post" enctype="multipart/form-data">
  123.         <p><label for="correo_elecronico">Email</label><input type="text" name="correo_electronico"></p>
  124.         <p><label for="foto">Foto</label><input type="file" name="foto"></p>
  125.         <p><input type="submit" value="Enviar"></p>
  126.     </form>
  127. </body>
  128. </html>
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #20 (permalink)  
Antiguo 13/07/2013, 09:38
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

El código al inicio isset como para que es? porque el campo correo_electronico esta como null en la base de datos.
  #21 (permalink)  
Antiguo 13/07/2013, 10:36
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Como tengo el formulario y el código que procesa ese formulario en el mismo archivo, tengo que verificar primero que existan variables ah procesar, si no existe la variable (que es lo que hace isset()) $_POST['correo_electronico'] quiere decir que no se ah enviado el formulario a procesar, por lo tanto solo mostramos el código HTML del formulario, de no verificarlo, PHP me arrojaria errores del tipo warning o incluso del tipo fatal al intentar usar variables no definidas!

Amigo, no es necesario que esperes a que alguien te conteste, si no sabes que hace determinado código visita la documentación de PHP, hay esta todo lo necesario!
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #22 (permalink)  
Antiguo 13/07/2013, 16:59
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Mil gracias amigo, por la paciencia y por explicarme tal cual son las cosas, de verdad, fue de gran ayuda para mi, por sobre todo para entender mas sobre este maravilloso lenguaje. Creo que voy a marcar como solucionado este tema. Gracias nuevamente por la ayuda. =)
  #23 (permalink)  
Antiguo 13/07/2013, 17:15
 
Fecha de Ingreso: julio-2013
Ubicación: Paraguay
Mensajes: 71
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Galería de fotos en php

Algo mas, es necesario usar esa variable en caso de que no este el formulario en el mismo archivo? y al seleccionar una foto muy grande, tomada con una canon eos 60 me arroja el siguiente error:

Código PHP:
Ver original
  1. Warning: getimagesize(): Filename cannot be empty en referencia a la linea 27, en donde definimos la variable: $formato = getimagesize($_FILES['foto']['tmp_name']);

Es curioso, porque solo al seleccionar esos archivos arroja ese error.

Última edición por ismaelmolinas; 13/07/2013 a las 17:34
  #24 (permalink)  
Antiguo 13/07/2013, 18:12
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Galería de fotos en php

Depende, la variable lo único que hace es que obliga a que se envíen los datos por POST, ya depende si lo quieres dejar así o quitarlo da igual siempre y cuando sea un archivo diferente al formulario...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Etiquetas: formulario, fotos, html, mysql, select, sql, tabla, variable, variables
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 12:17.