Ver Mensaje Individual
  #29 (permalink)  
Antiguo 08/09/2010, 21:24
Avatar de perryjr
perryjr
 
Fecha de Ingreso: julio-2010
Ubicación: Granada, Spain, Spain
Mensajes: 190
Antigüedad: 14 años, 3 meses
Puntos: 27
Sonrisa Respuesta: como crear un perfil de usuario?

bueno, yo puse el guardar y el ver el avatar en el mismo archivo:

Código PHP:
Ver original
  1. <?php
  2.  
  3. define('THUMBNAIL_SIZE', 100);
  4.  
  5. ob_start(); // previene enviar nuevas lineas o espacios que corromperian la imagen y que provienen de otros archivos que incluyo
  6.  
  7.   require_once(...);
  8.  
  9.  
  10. $func = empty($_GET['func']) ? '' : $_GET['func'];
  11. $id = empty($_GET['id']) ? 0 : $_GET['id'];
  12.   settype($id, 'integer'); // me aseguro de que id es un integer
  13.  
  14. switch($func) {
  15.   case 'view':
  16.    // si especifica usuario
  17.     if($id > 0) {
  18.       // $db es una clase mia que me sirve para agrupar las funciones y ponerles tratamiento de errores
  19.       // aunque sus nombres son transparentes de sus equivalencias en mysql
  20.       $result = $db->query('SELECT * FROM avatars WHERE user = ' . $id);
  21.       $row = $db->fetch($result);
  22.       $db->free($result);
  23.      
  24.      // si tiene avatar lo envio y exit
  25.       if($row) {
  26.         header( 'Content-Type: ' . $row['mime'] );
  27.         echo $row['avatar'];
  28.         exit;
  29.       }
  30.     }
  31.    
  32.     // si no tiene o no especifica (usuario anónimo) abro y envio el predeterminado
  33.     $filename = 'images/sample-gravatar.jpg';
  34.     header('Content-Type: image/jpeg');
  35.     echo file_get_contents($filename);
  36.    
  37.     break;
  38.    
  39.   case 'save':
  40.    // $user es otra clase que controla las sesiones
  41.     if(!$user->isUser()) trigger_error('USER-RIGHTS-REQUIRED');
  42.  
  43.    // dos if's para comprobar que no hay errores
  44.     if(empty($_FILES['avatar']))
  45.       $err = 'AVATAR-UPLOAD-NO-FILE';
  46.     elseif($_FILES['avatar']['error'] == UPLOAD_ERR_FORM_SIZE) {
  47.       $err = 'AVATAR-UPLOAD-TOO-LARGE';
  48.     } elseif(is_uploaded_file($_FILES['avatar']['tmp_name'])) {
  49.       // mime types permitidos
  50.       $mimetypes = array('image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
  51.      
  52.       $size = $_FILES['avatar']['size'];
  53.       $type = $_FILES['avatar']['type'];
  54.       $tmp_name = $_FILES['avatar']['tmp_name'];
  55.      
  56.       // reviso el mime type y el tamaño
  57.       if(!in_array($type, $mimetypes)) $err = 'AVATAR-UPLOAD-BAD-MIMETYPE';
  58.       elseif($size < 200) $err = 'AVATAR-UPLOAD-TOO-SMALL';
  59.       elseif($size > 100000) $err = 'AVATAR-UPLOAD-TOO-LARGE';
  60.       else {
  61.         // si es correcta uso la extensión de PHP llamada GD para crear una copia
  62.         // de la imagen en memoria
  63.         switch($type) {
  64.           case $mimetypes[0]:
  65.           case $mimetypes[1]:
  66.             $img = imagecreatefromjpeg($tmp_name);
  67.             break;
  68.            
  69.           case $mimetypes[2]:
  70.             $img = imagecreatefromgif($tmp_name);
  71.             break;
  72.            
  73.           case $mimetypes[3]:
  74.             $img = imagecreatefrompng($tmp_name);
  75.             break;
  76.         }
  77.  
  78.         // si la libreria no ha tenido problemas, hago el avatar al tamaño que a mi me interesa      
  79.         if(!$img) $err = 'AVATAR-UPLOAD-BAD-FORMAT';
  80.         else {
  81.           $imgSize = getimagesize($tmp_name);
  82.          
  83.           $thumb = imagecreatetruecolor(THUMBNAIL_SIZE, THUMBNAIL_SIZE);
  84.           imagecopyresized($thumb, $img, 0, 0, 0, 0, THUMBNAIL_SIZE, THUMBNAIL_SIZE, $imgSize[0], $imgSize[1]);
  85.          
  86.           // Esto es un pequeño truco porque GD no permite obtener el binario
  87.           // de la imagen para guardarlo en la base de datos, así que lo que hago es
  88.          // escribir la imagen como si fuera a enviarse al cliente, pero activo el buffer para recuperar
  89.          // mñás tarde todo el código que se ha enviado.
  90.           ob_start(); // start buffering the output
  91.           switch($type) {
  92.             case $mimetypes[0]:
  93.             case $mimetypes[1]:
  94.               imagejpeg($thumb);
  95.               break;
  96.              
  97.             case $mimetypes[2]:
  98.               imagegif($thumb);
  99.               break;
  100.              
  101.             case $mimetypes[3]:
  102.               imagepng($thumb);
  103.               break;
  104.           }
  105.           $imgContents = ob_get_contents(); // Get the buffer and clean it.
  106.           ob_end_clean();
  107.          
  108.           // quito caracteres raros que puedan afectar a la hora de guardar
  109.           $imgContents = str_replace( '##', '\#\#', $db->escape($imgContents) );
  110.          
  111.           // inserto el nuevo avatar en la base de datos
  112.           $sql = 'INSERT INTO avatars(`user`, `mime`, `avatar`) VALUES
  113.            (' . $user->getId() . ', "' . $type . '", "' . $imgContents . '")
  114.            ON DUPLICATE KEY UPDATE mime = "' . $type . '", avatar = "' . $imgContents . '";';
  115.           $db->query($sql);
  116.  
  117.           // le digo al usuario que todo va bien
  118.           $template->addRedirect('/accounts/avatars.php');
  119.           trigger_error('AVATAR-UPLOADED');
  120.         }
  121.       }
  122.     } else
  123.       $err = 'AVATAR-UPLOAD-NO-FILE';
  124.    
  125.     // si el usuario llega aquí significa que ha ocurrido algún error
  126.     $template->assignVar('UPLOAD-ERROR', getPageMessage($err));
  127.     $template->load('accounts/avatars/profile-change');
  128.     $template->send();
  129.  
  130.     break;
  131. }
  132.  
  133.  
  134. ?>


EXPLICACIONES:

1. Junte dos páginas en una: la de ver, y la de guardar. de ahí el switch para diferenciarlas (de hecho en la versión original tenías muchas más secciones que no vienen a cuento). Si lo haces por primera vez mejor hacerlo separadas como lo tienes tu.

2. Las direcciónes para los avatares quedarían algo así:
VER -> /avatar.php?func=view&id=...
GUARDAR -> /avatar.php?func=save

3. Hay millones de maneras de hacerlo, yo te muestro la solución que usé. Seguramente no es la más elegante.

4. Hasta hace poco algunos de mis proyectos usaban el trigger_error(); intensivamente, y este código es ejemplo de ello. No te recomiendo que sigas el ejemplo y te insto en cambio a poner en vez de mi trigger_error este código:
Código PHP:
Ver original
  1. echo '...';
  2.   exit;
Es mucho más intuitivo.

5. Como ya te he dicho no es un código de ejemplo, es un pequeño recorte de un proyecto mio, que tiene variables que no están definidas en este archivo: $db, $template, $user, etc. pero espero sinceramente que te sirva para coger ideas y pequeños snnipets de código para tu sistema.

Y bueno, que cualquier pregunta más que no tengas problema en decirlo porque yo tampoco tengo problema en contestarte. =D