[PHP] Upload de imágenes, con mas seguridad, js?
Bueno me pille este código bastante simple para subir imágenes:
Aquí el formulario de subida:
<form action="upload.php" method="post" enctype="multipart/form-data">
<td class="text">
<input name="archivo" type="file" class="casilla" id="archivo" size="35" />
<input name="enviar" type="submit" class="boton" id="enviar" value="Upload File" />
<input name="action" type="hidden" value="upload" />
</form>
Como puedo agregarlo mas seguridad e integración con JS (Ajax) ?
Puede parecer mucho, pero lo necesito >< Gracias de antemano.
<?php
$status = "";
if ($_POST["action"] == "upload")
{
// obtenemos los datos del archivo
$tamano = $_FILES["archivo"]['size'];
$tipo = $_FILES["archivo"]['type'];
$archivo = $_FILES["archivo"]['name'];
$prefijo = substr(md5(uniqid(rand())),0,6);
if ($archivo != "")
{
if ($tipo == "image/gif" || $tipo == "image/jpeg" || $tipo == "image/jpg")
{
$destino = "uploads/".$prefijo."_".$archivo;
if (copy($_FILES['archivo']['tmp_name'],$destino))
{
$status = "Archivo subido: <b>".$archivo."</b>";
}
else
{
$status = "Error al subir el archivo";
}
}
else
{
$status = "Error: solo se permite GIF o JPG";
}
}
else
{
$status = "Error al subir archivo";
}
}
?>Aquí el formulario de subida:
<form action="upload.php" method="post" enctype="multipart/form-data">
<td class="text">
<input name="archivo" type="file" class="casilla" id="archivo" size="35" />
<input name="enviar" type="submit" class="boton" id="enviar" value="Upload File" />
<input name="action" type="hidden" value="upload" />
</form>
Como puedo agregarlo mas seguridad e integración con JS (Ajax) ?
Puede parecer mucho, pero lo necesito >< Gracias de antemano.
bueno le faltan cosas en seguridad como por ejemplo
respecto a validar la extension seria mucho mejor hacerlo asi
en particular en ves de copiar la imagen yo haria esto
verificaria si la imagen tiene errores al cargarse de esta manera y si es asi eliminarla
y bueno para subirlo por ajax seria mucho mas sencillo...
solo poner en tu cabezera esto:
y donde quieras que se muestre el resultado en ajax pon arriba del formulario o donde quieras
haslo asi:
con eso donde muestre algun error o algo parara y regresara por ajax el mensaje
espeor te sirva..
saludos!
if(!is_uploaded_file($_FILES['archivo']['tmp_name']))
{
echo 'Error al subir la imagen';
return false;
}respecto a validar la extension seria mucho mejor hacerlo asi
if(!preg_match("#^(gif|jpg|jpeg|jpe|bmp|png)$#i", strtolower(mb_substr(strrchr($_FILES["archivo"]['name'];, "."), 1))))
{
echo 'error en la extension';
return false;
}en particular en ves de copiar la imagen yo haria esto
$mover = @move_uploaded_file($_FILES['archivo']['tmp_name'], $destino."/".$prefijo."_".$archivo);
if(!$mover)
{
echo 'no se a podidoca cargar la imagen';
return false;
}verificaria si la imagen tiene errores al cargarse de esta manera y si es asi eliminarla
if($_FILES["archivo"]['error'])
{
@unlink($destino);
echo 'error';
return false;
}y bueno para subirlo por ajax seria mucho mas sencillo...
solo poner en tu cabezera esto:
Quote:<script language="javascript">No te olvides de poner al formulario name="miformulario" y id="miformulario"
$(document).ready(function() {
$('#form, #fat, #miformulario').submit(function() {
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data) {
$('#resultado').html(data);
}
})
return false;
});
})
</script>
y donde quieras que se muestre el resultado en ajax pon arriba del formulario o donde quieras
Quote:<div id="resultado"></div>y al mandar el formulario se envia por ajax y actualiza eso.. otra cosa en upload.php en vez de regresar el dato como lo haces osea asi:
if(blablabla)
{
$status = XXXX
}
if(blablabla)
{
$status = XXX
}
return $statushaslo asi:
if(blablabla)
{
echo 'TU MENSAJE';
return false;
}
if(blablabla)
{
echo 'TU MENSAJE';
return false;
}con eso donde muestre algun error o algo parara y regresara por ajax el mensaje
saludos!
PD: Otra cosa que olvide si quieres mostrar error con ajax aslo asi
error: function(data) {
$('#error').html(data);
}
error: function(data) {
$('#error').html(data);
}
Logre hacer casi todo lo que me dijiste, lo de verificar si la imagen tiene error al cargarse no supe donde ponerlo & tampoco lo del AJAX, te dejo el código completo aquí:
PD: El código JS que haz puesto es con jquery o prototype? Porque ninguno de los dos me funciona..
<?php
define("IN_MYBB", 1);
require_once "project/global.php";
$status = "";
if ($_POST["action"] == "upload")
{
// obtenemos los datos del archivo
$tamano = $_FILES["archivo"]['size'];
$tipo = $_FILES["archivo"]['type'];
$archivo = $_FILES["archivo"]['name'];
$prefijo = substr(md5(uniqid(rand())),0,16);
if(!is_uploaded_file($_FILES['archivo']['tmp_name']))
{
echo 'Error al subir la imagen';
return false;
}
else
{
if(!preg_match("#^(gif|jpg|jpeg|jpe|bmp|png)$#i", strtolower(mb_substr(strrchr($_FILES["archivo"]['name'], "."), 1))))
{
echo 'Archivo con extensión no valida.';
return false;
}
else
{
$ext = substr(strrchr($archivo, '.'), 1);
$path = "_" . $prefijo . "." . $ext;
$destino = "files/" . $path;
$moveimg = @move_uploaded_file($_FILES['archivo']['tmp_name'], $destino);
if(!$moveimg)
{
echo 'No se a podido cargar la imagen.';
return false;
}
else
{
$insertarray = array(
'name' => $archivo,
'path' => $path,
'type' => $tipo,
'size' => $tamano,
'regupload' => TIME_NOW
);
$db->insert_query("imgupload", $insertarray);
$status = "Archivo subido: <b>".$archivo."</b>";
}
}
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP upload - unijimpe</title>
<link href="estilo.css" rel="stylesheet" type="text/css" />
<script language="javascript">
$(document).ready(function()
{
$('#imgupl').submit(function()
{
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data)
{
$('#resultado').html(data);
}
})
return false;
});
})
</script>
</head>
<body>
<table width="413" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="413" height="40" class="titulo">PHP upload - unijimpe </td>
</tr>
<tr>
<td class="text">Por favor seleccione el archivo a subir:</td>
</tr>
<tr>
<form action="upload.php" name="imgupl" id="imgupl" method="post" enctype="multipart/form-data">
<td class="text">
<input name="archivo" type="file" class="casilla" id="archivo" size="35" />
<input name="enviar" type="submit" class="boton" id="enviar" value="Upload File" />
<input name="action" type="hidden" value="upload" /> </td>
</form>
</tr>
<tr>
<td class="text" style="color:#990000"><div id="resultado"></div></td>
</tr>
<tr>
<td height="30" class="subtitulo">Listado de Archivos Subidos </td>
</tr>
<tr>
<td class="infsub">
<?php
$getimages = $db->simple_select('imgupload', '*', '', array('order_by' => 'regupload', 'order_dir'=>'ASC'));
echo "<ul>";
while($image = $db->fetch_array($getimages))
{
$user = get_user($image['uid']);
echo "<li><a href=\"files/" . $image['path'] . "\" class=\"linkli\">" . $image['path'] . "</a> | " . $user['username'] . "</li>\n";
}
echo "</ul>";
?> </td>
</tr>
</table>
</body>
</html>
PD: El código JS que haz puesto es con jquery o prototype? Porque ninguno de los dos me funciona..
yo lo haria asi mira no lo testie ni nada pero debe funcionar :p (olvide el link de un script para q funcione el ajax lo siento)
Ahora yo separe el formulario del upload quiero decir que el formulario esta en un archivo independiente por ejemplo index.php
y el upload.php seria asi:
Ahora yo separe el formulario del upload quiero decir que el formulario esta en un archivo independiente por ejemplo index.php
<?php
define("IN_MYBB", 1);
require_once "project/global.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP upload - unijimpe</title>
<link href="estilo.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script language="javascript">
$(document).ready(function()
{
$('#imgupl').submit(function() {
{
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data)
{
$('#resultado').html(data);
}
})
return false;
});
})
</script>
</head>
<body>
<table width="413" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="413" height="40" class="titulo">PHP upload - unijimpe </td>
</tr>
<tr>
<td class="text">Por favor seleccione el archivo a subir:</td>
</tr>
<tr>
<form action="upload.php" name="imgupl" id="imgupl" method="post" enctype="multipart/form-data">
<td class="text">
<input name="archivo" type="file" class="casilla" id="archivo" size="35" />
<input name="enviar" type="submit" class="boton" id="enviar" value="Upload File" />
<input name="action" type="hidden" value="upload" /> </td>
</form>
</tr>
<tr>
<td class="text" style="color:#990000"><div id="resultado"></div></td>
</tr>
<tr>
<td height="30" class="subtitulo">Listado de Archivos Subidos </td>
</tr>
<tr>
<td class="infsub">
<?php
$getimages = $db->simple_select('imgupload', '*', '', array('order_by' => 'regupload', 'order_dir'=>'ASC'));
echo "<ul>";
while($image = $db->fetch_array($getimages))
{
$user = get_user($image['uid']);
echo "<li><a href=\"files/" . $image['path'] . "\" class=\"linkli\">" . $image['path'] . "</a> | " . $user['username'] . "</li>\n";
}
echo "</ul>";
?> </td>
</tr>
</table>
</body>
</html> y el upload.php seria asi:
<?php
define("IN_MYBB", 1);
require_once "project/global.php";
$tamano = $_FILES["archivo"]['size'];
$tipo = $_FILES["archivo"]['type'];
$archivo = $_FILES["archivo"]['name'];
$prefijo = substr(md5(uniqid(rand())),0,16);
if(!is_uploaded_file($_FILES['archivo']['tmp_name']))
{
echo 'Error al subir la imagen';
return false;
}
if(!preg_match("#^(gif|jpg|jpeg|jpe|bmp|png)$#i", strtolower(mb_substr(strrchr($_FILES["archivo"]['name'], "."), 1))))
{
echo 'Archivo con extensión no valida.';
return false;
}
$ext = substr(strrchr($archivo, '.'), 1);
$path = "_" . $prefijo . "." . $ext;
$destino = "files/" . $path;
if(!$moveimg)
{
echo 'No se a podido cargar la imagen.';
return false;
}
if($_FILES["archivo"]['error'])
{
@unlink($destino);
echo 'error';
return false;
}
$insertarray = array(
'name' => $archivo,
'path' => $path,
'type' => $tipo,
'size' => $tamano,
'regupload' => TIME_NOW
);
$db->insert_query("imgupload", $insertarray);
echo "Archivo subido: <b>".$archivo."</b>";
return false;
?>
Queda igual, la imagen se sube, pero el Ajax no funciona..
Solo devuelve esto
Solo devuelve esto
echo "Archivo subido: <b>".$archivo."</b>";
puedes ponerme el link porfavor.. quiero ver como funciona...
Lo tengo solo en mi PC, si quieres después lo subo por hay, pero ya te digo lo del ajax no funciona, recarga la pagina completa.
ok dame unos minutos lo hago en localhost :p