[PHP]  Upload de imágenes, con mas seguridad, js?
Bueno me pille este código bastante simple para subir imágenes: <?php $status = ""; if ($_POST["action"] == "upload") { // obtenemos los datos d...

Bueno me pille este código bastante simple para subir imágenes:

Código PHP:
<?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.
Última modificación: 3 Sep, 2012, 7:20 pm por V1K1NGO.
bueno le faltan cosas en seguridad como por ejemplo
Código PHP:
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
Código PHP:
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
Código PHP:
$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
Código PHP:
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:
Cita:<script language="javascript">
$(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>
No te olvides de poner al formulario name="miformulario" y id="miformulario"

y donde quieras que se muestre el resultado en ajax pon arriba del formulario o donde quieras
Cita:<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:
Código PHP:
if(blablabla)
{
    
$status XXXX
}

if(
blablabla)
{
    
$status XXX
}
return 
$status 

haslo asi:
Código PHP:
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 Wink espeor te sirva..
saludos!
PD: Otra cosa que olvide si quieres mostrar error con ajax aslo asi

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í:


Código PHP:
<?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..
Última modificación: 4 Sep, 2012, 4:40 am por V1K1NGO.
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

Código 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:
Código PHP:
<?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;
    
?>
Última modificación: 4 Sep, 2012, 8:05 am por Pomelete.
Queda igual, la imagen se sube, pero el Ajax no funciona..
Solo devuelve esto
Código PHP:
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
listo ya detecte el error esta mal el script le faltaba cerrar el document ready.. remplaza tu script por este

Código:
<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>

y dime si funciona
Última modificación: 4 Sep, 2012, 9:17 am por Pomelete.