Hola, ante todo, gracias a todos los que mi leen mi tema, voy a intentar plantear mi duda lo mejor posible, si algo no se entiende preguntar por favor, tengo una aplicación para subir ficheros, voy a plantear el problema de tres formas para que se entienda mejor:
Como usuario:
Voy a subir un archivo, pero resulta que al subir el archivo me sale este error: Warning: POST Content-Length of 108788637 bytes exceeds the limit of 8388608 bytes in Unknown on line 0, la verdad que me parece poco profesional está página
Como "Hacker":
Voy a subir un archivo algo pesado que seguro que no está permitido subir para saber que mensaje me sale y a partir de ahí voy indagando a ver si puedo hacerl algún daño al autor de esta página
Como programador:
Quiero que no salga ese mensaje, no quiero subir el tamaño máximo para subir archivos, si no que cuando alguien intente subir un archivo demasiado grande no le este permitido pero le salga un mensaje personalizado por mí
He probado a utilizar error_reporting(0), pero no me ha funcionado, que más puedo hacer? Es que no controlo muy bien lo de las excepciones, si alguien podría hecharme una mano lo agradecería,
Un saludo, Gonzalo
Pon una @ donde te de el error
Pero el error se produce en toda la página, yo creo, no creo que sea inducido por alguna linea en concreto
Primero que nada, que tipo de adceso tienes al servidor? es local, es compartido, es gratuito, es VPS.
si es compartido estara muy limitado ante las configuraciones posibles, si es un VPS entonces puedes personalizar los errores, entre lo mas facil y practico:
1) Puedes desactivar todos los errores y advertencias desde php.ini y procesar el archivo desde php calculando el tamaño del mismo y en base a eso guardarlo o borrarlo y mostrar un mensaje.
2) Puedes disminuir o aumentar el tamaño maximo de envio de datos por POST para que el error no aparesca.
3) Puedes disminuir el tiempo maximo que el servidor resive datos por POST y asi generar un error 500 en el servidor que puedes personalizar.
4) Puedes disminuir el tiempo maximo de ejecucion de un script PHP y generar un error 500 personalizado.
ahora bien, puedes validar el tamaño maximo con javascript antes de enviarlo, asi aparentemente nunca exedera el tamaño y tipo de archivo que tu especifiques, esto es solo una capa mas de seguridad, lo que si es seguro que via web no es recomendado subir archivos muy grandes, estos sobrecargan el servidor, si vas ha subir archivos grandes mejor subirlos por FTP.
Hola, ante todo, muchas gracias a los dos,
francisco, gracias por el enlace, la verdad que muy interesante, pero no me funciona, a continuación os dejare el código a ver si vosotros podéis ver algo que yo no soy capaz
serverdns, de momento trabajo en local, pero mi intención es arreglar este problema para poder subir a un servidor real, gratuito, por lo tanto las indicaciones del primer paso no me sirven, aún que se agradece, las del segundo y tercer paso no entiendo muy bien si son a nivel local o no, podrías explicármelas un poco mejor? y las indicaciones del cuarto paso y la validación mediante javascript si que me parecen muy muy interesantes, podrías hacer un poco más de inca pie sobre esas configuraciones por favor?
Ahora os pongo el código del archivo donde esta el formulario para subir el archivo:
<meta charset="iso-8859-1">
<?php
//Se habilitan las variables de sesion
session_start();
//Pasar los datos del formulario a variables
$nombre=$_POST['nombre'];
$apellidos=$_POST['apellidos'];
$provincia=$_POST['provincia'];
$localidad=$_POST['localidad'];
$direccion=$_POST['direccion'];
$cp=$_POST['cp'];
$email=$_POST['email'];
$telefono=$_POST['telefono'];
$nacimiento=$_POST['nacimiento'];
$sexo=$_POST['sexo'];
$estudios=$_POST['estudios'];
$monthlastjob=$_POST['monthlastjob'];
$yearlastjob=$_POST['yearlastjob'];
$favorito=$_POST['favorito'];
//Crear la conexión
mysql_connect("localhost","root","")or die("No se pudo establecer conexión.");
mysql_select_db("curriculums")or die("No se pudo establecer conexión coin la base de datos.");
//Insertar los datos
$consulta=mysql_query("INSERT INTO curriculums (nombre,apellidos,provincia,localidad,direccion,cp,email,telefono,nacimiento,sexo,estudios,monthlastjob,yearlastjob,favorito) VALUES ('$nombre','$apellidos','$provincia','$localidad','$direccion','$cp','$email','$telefono','$nacimiento','$sexo','$estudios','$monthlastjob','$yearlastjob','$favorito')")or die("No se pudieron insertar los datos, intentelo de nuevo más tarde, gracias.");
echo 'Sus datos fueron introducidos correctamante, muchas gracias.';
echo '<br>Ahora, si lo desea, puede subir su curriculum en formato pdf.';
?>
<?php
//No se habilita de nuevo las variables de sesión porque ya está iniciada antes
//Se pasan por variables de sesión el nombre y apellidos
$_SESSION['nombre']=$nombre;
$_SESSION['apellidos']=$apellidos;
?>
<!--SUBIR CURRICULUM EN PDF-->
<!--Esta página redireccionara a upload.php-->
<form method="post" action="upload.php" enctype="multipart/form-data">
Suba su curriculum en formato "pdf" <input type="file" name="cv" /> <input type="submit" name="enviar" value="Enviar" />
</form>
Y ahora el código de "upload.php":
<?php
@
//Habilitamos variables de sesion
session_start();
error_reporting(0);
if( isset($_FILES['cv']['tmp_name']) ){ //verificamos que realmente haya algo que guardar
if( $_FILES['cv']['size'] < 600000 ){ //limitamos el peso del archivo a no mas de 6MB por ejemplo
//Movemos el archivo subido de la carpeta temporal a la definitiva
move_uploaded_file($_FILES['cv']['tmp_name'],'upload/'.$_FILES['cv']['name'])or die('Imposible tronco!');
//Pasamos la variables de sesiones a variables simples
$nombre=$_SESSION['nombre'];
$apellidos=$_SESSION['apellidos'];
//Pasamos el nombre que recibira el archivo a una variable
$nombrearchivo=$_SESSION['nombre'].$_SESSION['apellidos'].'.pdf';
//Renombramos el archivo
rename('upload/'.$_FILES['cv']['name'],'upload/'.$nombrearchivo);
//Pasamos la dirección del archivo a una variable
$link="upload/".$nombrearchivo;
//Creamos conexión e introducimos la dirección del archivo al campo archivo
mysql_connect("localhost","root","")or die("No se pudo establecer conexión.");
mysql_select_db("curriculums")or die("No se pudo establecer conexión coin la base de datos.");
mysql_query("UPDATE curriculums SET archivo='$link' WHERE nombre='$nombre' AND apellidos='$apellidos'")or die("No se pudo subir el nombre del archivo.");
//Informamos y redirigimos al usuario a destruir sesion
echo 'Su curriculum fue enviado con éxito, gracias.';
//Redireccionamos a sessiondestroy.php
header ('Refresh: 3; URL=sessiondestroy.php');
} else{
die ("El archivo no puede pesar mas de 6MB");
}
}
?>
Muchas gracias poro todo, un saludo
if( $_FILES['cv']['size'] <= 600000 ){ //limitamos el peso del archivo a no mas de 6MB por ejemplo
cambia 600000 por tus k
//Pasamos la variables de sesiones a variables simples $nombre=$_SESSION['nombre']; $apellidos=$_SESSION['apellidos']; //Pasamos el nombre que recibira el archivo a una variable $nombrearchivo=$_SESSION['nombre'].$_SESSION['apell idos'].'.pdf'; si te fijas bien pasas a variable normal y despues utilizas sesiones
if( @$_FILES['cv']['size'] < 600000 ){
prueba la @ a ver si funciona
//Informamos y redirigimos al usuario a destruir sesion
echo 'Su curriculum fue enviado con éxito, gracias.';
//Redireccionamos a sessiondestroy.php header ('Refresh: 3; URL=sessiondestroy.php');
} else {
echo 'El archivo no puede pesar mas de 6MB';
}
}
?>
<form enctype="multipart/form-data" action="upload. php" method="POST">
<input type="hidden" name="cv" value="200000" />
<input name="cv" type="file" />
<input type="submit" value="Enviar" />
</form>
cambia 200000
<?php
@
No me havia dado cuenta quita esa @ de hay
Nota sesion estart se deve poner en todas las paginas con session
Mas detalles mysql esta obsoleto haora es mysqli
Hola, en primer lugar, agradecer el esfuerzo hecho,
El limite de bytes puesto no me preocupa por ahora, ya que este puesto el que este puesto cuando se supera el tamaño sigue saliendo el error.
Es cierto que utilizo las variables de sesión en vez de las variables que creo más simples, gracias por la observación.
Lo de @ si lo había pensado, aún que no en ese lugar, el problema es que el mensaje de error me salta en la linea 0, así que lo he probado pero no ha habido suerte, pero gracias.
El párrafo en donde se redirige al usuario no entiendo que hay de nuevo.
El formulario de subida no entiendo muy bien los cambios porque sigue estando igual, podrías explicármelos porfavor?
El @ la puse para probar, pero la quitaré, gracias por la observación.
Porque me pones lo de session_start se debe poner en todas las páginas que usan variables de sesión?No lo entiendo, creo que la tengo bien puesta no?
Algo había leído en
http://www.w3schools.com/ sobre que mysql esta obsoleta, y la verdad que me gustaría aprender pdo para poder cambiar de sistema, ya que pronto los servidor cambiaran de versión de php y mysql ya no servirá de nada; Donde hay un buen tutorial en español de pdo?
Que diferencias hay entre mysql y mysqli a la hora de escribir?
Muchas gracias por tus respuestas, un saludo
Hola si te fijas bien en lo que te puse tienen cambios
Lo de sesion start era por si acaso
i creo que cuando te marca en la linea 0
el aviso podria estar en la linea 1
Gracias por la aclaración,
Pero lo de la linea 1, o no te entiendo lo que quieres decir o no creo que sea por el mensaje que da, aún que no entiendo mucho inglés, jeje, y porque solo está el comienzo de php.
Un saludo
La linea 1 sesion start
si utlizaz el navegador para ver los avances de tu script es posible que se guarde en la cache del navegador
borra la cache y datos del navegador u despues lo vuelves a visualizar el script si ba bien
Hola!
Como dice @serverdns, debes desactivar los errores en el php.ini (la configuración de PHP).
En un servidor de producción, los errores están deshabilitados, por ende esa advertencia no debería aparecer.
Busca la opción display_errors en el archivo php.ini y déjala en 0:
display_errors = 0
o, si tu configuración lo permite, utiliza ini_set( 'display_errors', 0 ); cuando no los quieras ver.