Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: elpirata15hd en 30 Abril 2011, 00:49 am



Título: Como hago lo siguiente..
Publicado por: elpirata15hd en 30 Abril 2011, 00:49 am
Quisiera limitar el tamaño de los archivos a adjuntar y que saltase una venta de "exceso de tamaño" o algo asi.El codigo que utilice es el siguiente

<?php
function form_mail($sPara, $sAsunto, $sTexto, $sDe)
{
$bHayFicheros = 0;
$sCabeceraTexto = "";
$sAdjuntos = "";

if ($sDe)$sCabeceras = "From:".$sDe."\n";
else $sCabeceras = "";
$sCabeceras .= "MIME-version: 1.0\n";
foreach ($_POST as $sNombre => $sValor)
$sTexto = $sTexto."\n".$sNombre." = ".$sValor;

foreach ($_FILES as $vAdjunto)
{
if ($bHayFicheros == 0)
{
$bHayFicheros = 1;
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";

$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";

$sTexto = $sCabeceraTexto.$sTexto;
}
if ($vAdjunto["size"] > 0)
{
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

$oFichero = fopen($vAdjunto["tmp_name"], 'r');
$sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
}
}

if ($bHayFicheros)
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
return(mail($sPara, $sAsunto, $sTexto, $sCabeceras));
}

//cambiar aqui el email
if (form_mail("poner_email@deDestino.com", $_POST[asunto],
"Los datos introducidos en el formulario son:\n\n", $_POST[email]))
echo "Su formulario ha sido enviado con exito";
?>

La linea que marque en rojo creo que es la que hay que modificar no?¿ pero lo que ya me pierdo,es el que salte un mensaje si se excede,yo creo que para adjuntar fotos,con 3 mb va bien no?¿

Gracias


Título: Re: Como hago lo siguiente..
Publicado por: merolhack en 30 Abril 2011, 01:20 am
Hola,

tienes que añadir un else y ponerle un return:
Código:
<?php
function form_mail($sPara, $sAsunto, $sTexto, $sDe)
{
$bHayFicheros = 0;
$sCabeceraTexto = "";
$sAdjuntos = "";

if ($sDe)$sCabeceras = "From:".$sDe."\n";
else $sCabeceras = "";
$sCabeceras .= "MIME-version: 1.0\n";
foreach ($_POST as $sNombre => $sValor)
$sTexto = $sTexto."\n".$sNombre." = ".$sValor;

foreach ($_FILES as $vAdjunto)
{
if ($bHayFicheros == 0)
{
$bHayFicheros = 1;
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";

$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";

$sTexto = $sCabeceraTexto.$sTexto;
}
if ($vAdjunto["size"] > 3000 )
{
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

$oFichero = fopen($vAdjunto["tmp_name"], 'r');
$sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
} else {
return false;
}
}

if ($bHayFicheros)
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
return(mail($sPara, $sAsunto, $sTexto, $sCabeceras));
}

//cambiar aqui el email
if (form_mail("poner_email@deDestino.com", $_POST[asunto], "Los datos introducidos en el formulario son:\n\n", $_POST[email])) {
echo "Su formulario ha sido enviado con exito";
} else {
echo "Su archivo excede los 3000";
}
?>


podrías usar la función exit:
http://php.net/manual/en/function.exit.php

Saludos!


Título: Re: Como hago lo siguiente..
Publicado por: elpirata15hd en 30 Abril 2011, 01:32 am
el exit te refieres para regresar al index?¿ yo lo tngo asi final del codigo para que regrese

Pero una pregunta,este mensaje no saltaria si cuando le de a examinar y intenta cargar un archivo que sobrepasa el limite,salga un cuadro de aviso antes de darle a enviar verdad?¿ quedaria mucho mejor asi,que si se queda en la pantallla blannca de aviso de exceso,lo unico que no se que codigo es necesario

PD:no anda bien el codigo que me dijo,se queda trabado,no tendria que ser asi esta linea = if ($vAdjunto["size"] > 0 < 3000)?¿  

mi codigo con,el que uso para adjuntar y que va perfecto es el siguiente,el que puse primero,es el sin mdificar,lo pongo por si ayuda para poner la limitacion con ventana de alerta

Código:
<?php
function form_mail($sPara, $sAsunto, $sTexto, $sDe)
{
$bHayFicheros = 0;
$sCabeceraTexto = "";
$sAdjuntos = "";

if ($sDe)$sCabeceras = "From:".$sDe."\n";
else $sCabeceras = "";
$sCabeceras .= "MIME-version: 1.0\n";
foreach ($_POST as $sNombre => $sValor)
$sTexto = $sTexto."\n".$sNombre." = ".$sValor;

foreach ($_FILES as $vAdjunto)
{
if ($bHayFicheros == 0)
{
$bHayFicheros = 1;
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";

$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";

$sTexto = $sCabeceraTexto.$sTexto;
}
if ($vAdjunto["size"] > 0)
{
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

$oFichero = fopen($vAdjunto["tmp_name"], 'r');
$sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
}
}

if ($bHayFicheros)
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
return(mail($sPara, $sAsunto, $sTexto, $sCabeceras));
}

//cambiar aqui el email
if (form_mail("micorreo@gmail.com", $_POST[asunto],
"Los datos introducidos en el formulario son:\n\n", $_POST[email]))
header("Location: index.php?opc=1");
?>


Título: Re: Como hago lo siguiente..
Publicado por: merolhack en 30 Abril 2011, 01:53 am
Ok, no lo probe jaja, pero entonces que te parece algo así:

Código:
<?php
function form_mail($sPara, $sAsunto, $sTexto, $sDe)
{
$bHayFicheros = 0;
$sCabeceraTexto = "";
$sAdjuntos = "";

if ($sDe)$sCabeceras = "From:".$sDe."\n";
else $sCabeceras = "";
$sCabeceras .= "MIME-version: 1.0\n";
foreach ($_POST as $sNombre => $sValor)
$sTexto = $sTexto."\n".$sNombre." = ".$sValor;

foreach ($_FILES as $vAdjunto)
{
if ($bHayFicheros == 0)
{
$bHayFicheros = 1;
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";

$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";

$sTexto = $sCabeceraTexto.$sTexto;
}
// Si el archivo es mayor a 0 bytes y menor que 30Kb
// En caso de que el valor dea en bytes claro jaja
if ($vAdjunto["size"] > 0 && $vAdjunto["size"] < 30000 )
{
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

$oFichero = fopen($vAdjunto["tmp_name"], 'r');
$sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
} else {
return false;
}
}

if ($bHayFicheros)
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
return(mail($sPara, $sAsunto, $sTexto, $sCabeceras));
}

//cambiar aqui el email
if (form_mail("poner_email@deDestino.com", $_POST[asunto], "Los datos introducidos en el formulario son:\n\n", $_POST[email])) {
echo "Su formulario ha sido enviado con exito";
} else {
echo "Su archivo excede los 3000";
}
?>

Si quieres que te lo diga al instante, lo tendrías que hacer con AJAX! Busca en google: AJAX +php +File uploader


Título: Re: Como hago lo siguiente..
Publicado por: elpirata15hd en 30 Abril 2011, 09:32 am
Ya estuve mirando lo que me dijiste y que va,es super complicado,es imposible hacer algo haci con un alert javascrit y php?¿

Gracias por el codigo,pero debe de seguir teniendo algo,porque cuando pesa menos de lo puesto,se envia y salta la pantalla blanca con que todo se envio bien,pero cuando intentas mandar algo superior a lo puesto,se queda ahi,como que lo intenta subir,no sale nada de qu epesa mucho,como que se queda bloqueado.

Enmede el "envio correcto" que tu has peusto para que salga la pantalla blanca,podria salir el header que yo puse?¿ porque esta configurado para que si se envia bien,regrese al index y salga una venta na de envio correcto


Título: Re: Como hago lo siguiente..
Publicado por: merolhack en 30 Abril 2011, 17:29 pm
ajaj no es con un simple alert, busca en Google: jQuery + AJAX +Upload File

Y ahi vas a poder ver scripts parecidos al de Gmail, que con AJAX validan el archivo e inclusive lo suben al servidor sin necesidad de recargar la página.

La función que te puse los que hace es que si el archivo pesa más, regresa un FALSE, es decir, que si le pones algo tipo:
Código:
<?php
if ( funcion(parametro1, parametro2)) {
// Si es TRUE lo que haga va aqui
echo "Los archivos pesan lo correcto, se han subido.";
} else {
// Si es FALSE lo que haga va aqui
echo "Los archivos NO pesan lo correcto, NO se han subido.";
}
?>
Si en tu código no pones ese ELSE se va a quedar trabado por que recies respuesta pero no haces nada con ella...
Saludos!


Título: Re: Como hago lo siguiente..
Publicado por: elpirata15hd en 1 Mayo 2011, 11:24 am
a esto te refieres?¿ http://www.miguelmanchego.com/2009/subir-archivos-usando-ajax-jquery/ es bastante complicado,casi que prefiero hacer funcionar el limitar con el que estabamos jajaja en que linea tengo que añadir el ultimo codigo para que funcione el limitador?


Título: Re: Como hago lo siguiente..
Publicado por: merolhack en 1 Mayo 2011, 15:58 pm
Es super sencillo subir archivos con jQuery, solo hay que saber programar...

Haber te explico como funciona tu código:
1.- Tienes una función que envía por email el archivo seleccionado.
2.- Esa función regresa TRUE o FALSE dependiendo de 2 cosas:
2.1.- TRUE Si al final se envía el email
2.2.- FALSE Si el archivo es mayor a los bytes dados
2.3.- FALSE Si no se envia el email
3.- A esa función la llamas desde algo como:
Código:
<?php
if ( funcion(parametro1, parametro2)) {
// Si es TRUE lo que haga va aqui
echo "Los archivos pesan lo correcto, se han subido.";
} else {
// Si es FALSE lo que haga va aqui
echo "Los archivos NO pesan lo correcto, NO se han subido.";
}
?>

Lo que puedes hacer es que antes de llamar a la función que envía el email, crea otra función para validar el tamaño del archivo, si devuelve TRUE esa función, entonces ahora si mandas el email.