bueno, yo puse el guardar y el ver el avatar en el mismo archivo:
Código PHP:
Ver original<?php
define('THUMBNAIL_SIZE', 100);
ob_start(); // previene enviar nuevas lineas o espacios que corromperian la imagen y que provienen de otros archivos que incluyo
require_once(...);
$func = empty($_GET['func']) ?
'' : $_GET['func']; $id = empty($_GET['id']) ?
0 : $_GET['id']; settype($id, 'integer'); // me aseguro de que id es un integer
switch($func) {
case 'view':
// si especifica usuario
if($id > 0) {
// $db es una clase mia que me sirve para agrupar las funciones y ponerles tratamiento de errores
// aunque sus nombres son transparentes de sus equivalencias en mysql
$result = $db->query('SELECT * FROM avatars WHERE user = ' . $id);
$row = $db->fetch($result);
$db->free($result);
// si tiene avatar lo envio y exit
if($row) {
header( 'Content-Type: ' . $row['mime'] ); echo $row['avatar'];
}
}
// si no tiene o no especifica (usuario anónimo) abro y envio el predeterminado
$filename = 'images/sample-gravatar.jpg';
header('Content-Type: image/jpeg');
break;
case 'save':
// $user es otra clase que controla las sesiones
// dos if's para comprobar que no hay errores
if(empty($_FILES['avatar'])) $err = 'AVATAR-UPLOAD-NO-FILE';
elseif($_FILES['avatar']['error'] == UPLOAD_ERR_FORM_SIZE) {
$err = 'AVATAR-UPLOAD-TOO-LARGE';
// mime types permitidos
$mimetypes = array('image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
$size = $_FILES['avatar']['size'];
$type = $_FILES['avatar']['type'];
$tmp_name = $_FILES['avatar']['tmp_name'];
// reviso el mime type y el tamaño
if(!in_array($type, $mimetypes)) $err = 'AVATAR-UPLOAD-BAD-MIMETYPE'; elseif($size < 200) $err = 'AVATAR-UPLOAD-TOO-SMALL';
elseif($size > 100000) $err = 'AVATAR-UPLOAD-TOO-LARGE';
else {
// si es correcta uso la extensión de PHP llamada GD para crear una copia
// de la imagen en memoria
switch($type) {
case $mimetypes[0]:
case $mimetypes[1]:
break;
case $mimetypes[2]:
break;
case $mimetypes[3]:
break;
}
// si la libreria no ha tenido problemas, hago el avatar al tamaño que a mi me interesa
if(!$img) $err = 'AVATAR-UPLOAD-BAD-FORMAT';
else {
imagecopyresized($thumb, $img, 0, 0, 0, 0, THUMBNAIL_SIZE
, THUMBNAIL_SIZE
, $imgSize[0], $imgSize[1]);
// Esto es un pequeño truco porque GD no permite obtener el binario
// de la imagen para guardarlo en la base de datos, así que lo que hago es
// escribir la imagen como si fuera a enviarse al cliente, pero activo el buffer para recuperar
// mñás tarde todo el código que se ha enviado.
ob_start(); // start buffering the output switch($type) {
case $mimetypes[0]:
case $mimetypes[1]:
break;
case $mimetypes[2]:
break;
case $mimetypes[3]:
break;
}
// quito caracteres raros que puedan afectar a la hora de guardar
$imgContents = str_replace( '##', '\#\#', $db->escape($imgContents) );
// inserto el nuevo avatar en la base de datos
$sql = 'INSERT INTO avatars(`user`, `mime`, `avatar`) VALUES
(' . $user->getId() . ', "' . $type . '", "' . $imgContents . '")
ON DUPLICATE KEY UPDATE mime = "' . $type . '", avatar = "' . $imgContents . '";';
$db->query($sql);
// le digo al usuario que todo va bien
$template->addRedirect('/accounts/avatars.php');
}
}
} else
$err = 'AVATAR-UPLOAD-NO-FILE';
// si el usuario llega aquí significa que ha ocurrido algún error
$template->assignVar('UPLOAD-ERROR', getPageMessage($err));
$template->load('accounts/avatars/profile-change');
$template->send();
break;
}
?>
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:
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