Foros del Web » Programando para Internet » PHP »

Upload de Ficheros ¡lo he probado ya todo!

Estas en el tema de Upload de Ficheros ¡lo he probado ya todo! en el foro de PHP en Foros del Web. Hola, amigos programadores Hace poco cree un formulario que permitía el upload de 5 ficheros en el mismo envío (POST) con el fin de que ...
  #1 (permalink)  
Antiguo 07/02/2006, 16:44
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Upload de Ficheros ¡lo he probado ya todo!

Hola, amigos programadores

Hace poco cree un formulario que permitía el upload de 5 ficheros en el mismo envío (POST) con el fin de que fueran guardados en el servidor.

Hoy he probado con un mismo fichero PDF de 0,15MB vincularlo a cada uno de los 5 campos "file" y enviar el formulario. Pues bien, resulta que sólo se suben 3 y el tercero da el error número 3 vinculado al cuarto fichero que se intenta subir que es el de "The uploaded file was only partially uploaded".

Utilizo la función "move_uploaded_file" y lo he mirado todo del php.ini

memory_limit = 8M
upload_max_filesize = 2M (el fichero es de 0,15M)
max_execution_time = 30 (el envío suele tardar unos 15s)
post_max_size = 6M
max_input_time = 120

De todas formas he puesto al inicio del script del formulario unas líneas que me aseguraran que se tomaban estos valores o más altos del tipo

ini_set("memory_limit","16M")
ini_set("upload_max_filesize","5M")
...

He añadido incluso la función set_limit_time(1200) por si servía de algo ¡pero nada!

¿A alguien se le ocurre qué puede estar fallando? Si necesitáis más información por favor pedidla, pero es que yo ya no puedo más.

Sólo un último apunte, 4 archivos de los 5 nunca sube, pero sí que es verdad que los 3 primeros hay veces que los sube (las que más) y veces que no (las que menos), lo que da que pensar que depende de alguna variable temporal que no controlo.

Lo he probado en navegadores distintos IE y Firefox así como desde conexiones a internet distintas.

Con mi servidor local SÍ funciona, es con el remoto que no va :(. El servidor es propio y es un Apache sobre Linux y PHP 4.3

Aquí dejo el reto!

Un saludo y gracias!
  #2 (permalink)  
Antiguo 07/02/2006, 19:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
"The uploaded file was only partially uploaded".

Con qué "código" obtienes ese mensaje de error?

Por cierto .. tu servidor HTTP tambíen intervienen en las limitaciones de un "upload" por HTTP que es lo que estás haciendo, revisalo:

http://www.forosdelweb.com/showpost....&postcount=146

También revisa ya que usas Linux temas de "quotas" (si es que trabajas eso en tu servidor) del directorio temporal que usas para subir tus archivos (el que usa PHP que se define en su configuración: upload_tmp_dir)

Un saludo,
  #3 (permalink)  
Antiguo 08/02/2006, 03:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Gracias por tu respuestas e interés.

Supongo que a lo que te refieres del servidor HTTP que también interviene es lo siguiente:

<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 10240000 // PARA 10MB o +
</Files>

Lo puse en un .htaccess en la carpeta donde se ejecuta mi script PHP pero no funcionó. En la configuración de Apache, para todo el servidor, no figura ninguna línea LimitRequestBody y leí por ahí que si no existe es ilimitado.

En cuanto al espacio en el directorio temporal no creo que se trate de eso. Comentaba que hice la prueba de enviar en los 5 uploads que me permite el formulario un archivo de unos 150KB y, a veces fallaba en el cuarto (que se subía parcialmente) y otras veces en el tercero, pero siempre se subían al servidor, como mínimo dos (no falta espacio en la carpeta).

Si hago la prueba con archivos de 1,5MB subiéndolos 5 veces, sólo se sube el primero, al segundo NUNCA llego (nuevamente el error de que el segundo upload sólo se ha podido subir parcialmente).

La parte críticia del código que me comentas es la siguiente:

Código:
/*
$fitxer es un array con los nombres de los campos del formulario que son de tipo 'file'. Hago un recorrido por todos para subirlos al servidor y dejarlos en su carpeta correspondiente
*/

$numfitxer=1;
$numfitxersadjunts=0;
$numerror=0;
$nom_adjunt_retocat=array();
			
while ($fitxer[$numfitxer] != '') {
		
  $nomcamp=$fitxer[$numfitxer];
				
  if ($_FILES[$nomcamp]["name"] != '') {				
				
    $numfitxersadjunts++;
    $nom_adjunt_original[$numfitxer]=$_FILES[$nomcamp]["name"];
    $nom_adjunt_retocat[$numfitxer]=substr($_SESSION[$nom_del_script]["idint"]+1000,1)."_".date('Y').$_SESSION[$nom_del_script][$fitxer[$numfitxer]];

					
    $tipus_fitxer = $_FILES[$nomcamp]["type"]; 
    $tamany_fitxer = $_FILES[$nomcamp]["size"];
 
    if (!(de_los_formatos_de_archivo_permitidos)) && ($tamany_fitxer < 2097152))) { 

      @mysql_query("UPDATE ".$nom_del_script." SET error=1 WHERE id=".$_SESSION[$nom_del_script."_idsol"]);
					
      $_SESSION[$nom_del_script]["inssol"]="No";
      $_SESSION[$nom_del_script."_res"]=5;
      $_SESSION[$nom_del_script]["grec"]="sí";
      header("Location:".$path."/".$nom_del_script."/".$nom_del_script.".php");
						die();
					
    } else {
							
      if ( (move_uploaded_file ($_FILES[$nomcamp]["tmp_name"],directori_on_pujar.$nom_adjunt_retocat[$numfitxer])) ) {
					
        chmod(directori_on_pujar.$nom_adjunt_retocat[$numfitxer],0666);
						
      } else {
						
        $numerror++;
        $error[$numerror]="No hem pogut rebre el fitxer ".$nom_adjunt_original;
       /*
         Aquí es donde $_FILES[$nomcamp]["error"] toma el valor 3 (sólo se ha podido subir el fichero parcialmente). Este error lo da al tercer o cuarto fichero, depende de cómo le dé al servidor, cuando subo con el form 5 ficheros de 150KB cada uno y da el error al segundo fichero si decido subir, por ejemplo, 5 ficheros de 1,5MB
      */
						
      }
					
    }
					
  }
				
  $numfitxer++;
			
}

Ojalá detectéis el problema.

Muchas gracias por todo.
  #4 (permalink)  
Antiguo 08/02/2006, 07:53
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 18 años, 2 meses
Puntos: 0
Prueba Este

config.php


Código PHP:


<?php



# Nombre carpeta de archivos
$carpeta_archivos '../Images/webcms/';
# Maximo Bytes
$bytes_max '500000';

?>


Subir.php

Código PHP:


<?php


# Mensaje por defecto.
$defecto 'Eliga el archivo a subir y presione el boton Enviar!.';

# Seteamos la variable $msg con un if 
# $variable = (exp) ? true : false;
$msg = ($_GET['errno']==1) ? $_GET['errmsg'] : $defecto;

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>

<head>
    <title>subir archivos</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <style type="text/css">
        body, table {
            background-color: #f2f2f2;
            font-family: tahoma;
            font-size: 10px;
        }
        
        input {
            background-color: #FFFFFF;
            border: 1px solid #000000;
            font-family: tahoma;
            font-size: 10px;
        }
    </style>
</head>

<body>

<form method="post" enctype="multipart/form-data" action="enviar.php">
    
  <table width="100%" style="margin: auto;">
    <tr>
            <td colspan="2" style="width: 100%;"><b><?=$msg?></b></td>
        </tr>
        <tr>
            <td style="width: 45%;">(1) Elegir Archivo:</td>
            <td style="width: 55%;"><input type="file" name="archivo" size="20" /></td>
        </tr>
        <tr>
            <td style="width: 45%;">(2) Enviar Archivo:</td>
            <td style="width: 55%;"><input type="submit" value="Enviar!" /></td>
        </tr>
    </table>
</form>

</body>

</html>

enviar.php


Código PHP:



<?php



include("config.php");

# Si la carpeta no existe la creamos y le aplicamos los permisos.
if(!file_exists($carpeta_archivos))
{
    
mkdir($carpeta_archivos);
    @
chmod($carpeta_archivos0777);
}

# Verificamos que este setiado el archivo.
if($_FILES['archivo'])
{
    
# Verificamos que su tamaño sea mejor que los bytes que as puesto en la configuración.
    
if((1000 $bytes_max) > $_FILES['archivo']['size'])
    {
        
# Seteamos las variables para mejor facilidad
        
$tmp $_FILES['archivo']['tmp_name'];
        
$name $_FILES['archivo']['name'];
        
$ahora $carpeta_archivos.'/'.$name;
        
        
# Movemos el archivo a la carpeta
        
move_uploaded_file($tmp$ahora);
        
        
# Nos movemos al index.php

    
}
    else
 echo  
"Error al Subir";
 echo 
"<br>";
 echo  
"Su archivo excede los  ".$bytes_max." Bytes ";
#        header("Location: index.php?errno=1&errmsg=Su archivo excede los ".$bytes_max."bytes.");
}
else

# echo  "Error al Subir";

 # header("Location: index.php?errno=1&errmsg=No ah seleccionado ningun archivo.");

?>


Espero te sirva a mi me funciona perfectamente
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #5 (permalink)  
Antiguo 08/02/2006, 10:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
Supongo que a lo que te refieres del servidor HTTP que también interviene es lo siguiente:

<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 10240000 // PARA 10MB o +
</Files>
A veces esa configuración no está en httpd.conf sino en un "php.conf" aparte .. el caso es que alguna referencia a la configuración concreta de PHP haría tu httpd.conf si es que estuviese vinculado como archivo a parte (para diferenciar y localizar rápidamente configuración de PHP).

Un saludo,
  #6 (permalink)  
Antiguo 08/02/2006, 10:38
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Cita:
Iniciado por carlosfocus
Espero te sirva a mi me funciona perfectamente
Muchas gracias, Carlosfocus, pero no creo que falle ya que lo que hace tu script es subir un único archivo y, hasta el momento, en eso no he tenido problema (incluso en 2 o 3, a veces). Es cuando subo muchos ficheros (no necesariamente grandes) o cuando son grandes que me falla ya en el segundo (no en el primero).

Yo estoy convencido de que es un problema de alguna variable de tiempo, pues a veces subiendo los mismos ficheros, una vez da el error al 4 upload de 5 o, a veces, al tercero (siendo los mismos ficheros, mismo tamaño).

Cita:
Iniciado por cluster
A veces esa configuración no está en httpd.conf sino en un "php.conf" aparte .. el caso es que alguna referencia a la configuración concreta de PHP haría tu httpd.conf si es que estuviese vinculado como archivo a parte (para diferenciar y localizar rápidamente configuración de PHP).
Gracias por preocuparte, cluster, pero mi httpd.conf no hace ningún "include" a ningún php.conf. De hecho las extensiones de php, páginas iniciales .php y demás, está todo en httpd.conf.

Además, como comento en este mismo mensaje a Carlosfocus yo cada vez estoy más convencido de que es un problema de alguna variable temporal, pero no sé de cuál. Tampoco sé si será alguna del Apache (que dudo que tenga) o de PHP.

En fin, yo seguiré buscando por Internet. Mientras tanto, si se os ocurre alguna idea no dudéis en transmitirla.

Muchas gracias
  #7 (permalink)  
Antiguo 08/02/2006, 17:21
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Sabéis cómo puedo saber el valor de la variable LimitRequestBody que está usando mi servidor Apache?

He leído que si no está definido en el httpd.conf es ilimitado, pero como entenderéis ya dudo hasta de que mi madre sea mi madre XD

Gracias!
  #8 (permalink)  
Antiguo 08/02/2006, 18:21
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años
Puntos: 33
De acuerdo

te dejo este link http://httpd.apache.org/docs/1.3/mod...mitrequestbody donde dice que limitrequestbody esta unicamente disponible desde apache 1.3.2
  #9 (permalink)  
Antiguo 09/02/2006, 05:08
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Muchas gracias, Mauled, pero no dice cómo puedo consultar el valor que tiene por defecto

Seguiré buscando... ¡qué rabia cuando no encuentras la solución a un problema!

Gracias a todos.
  #10 (permalink)  
Antiguo 13/02/2006, 13:31
 
Fecha de Ingreso: febrero-2006
Mensajes: 6
Antigüedad: 18 años, 1 mes
Puntos: 0
Solucionado

Señores, problema resuelto. Se ha actualizado en el servidor la versión de PHP de la 4.3.3. a la 4.3.11 (ya era hora) y se ha solucionado el problema. ¿Bug de PHP? ¿Fruto de la casualidad? No lo sé, no obstante, que me quiten lo que he aprendido este día (parte gracias a vosotros).

Seguiré por el foro.

Un saludo!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:52.