Foros del Web » Programando para Internet » PHP »

Subida de varios de archivos

Estas en el tema de Subida de varios de archivos en el foro de PHP en Foros del Web. hola he utilizado el código que un forero puso aqui para subir varios archivos a la vez añadiendole un par de campos más, Tipo y ...
  #1 (permalink)  
Antiguo 24/01/2009, 06:51
Avatar de Javiglez  
Fecha de Ingreso: marzo-2006
Ubicación: Valladolid
Mensajes: 496
Antigüedad: 18 años, 2 meses
Puntos: 0
Subida de varios de archivos

hola he utilizado el código que un forero puso aqui para subir varios archivos a la vez añadiendole un par de campos más, Tipo y Expediente al que pertenece el documento y el id documento se lo paso en un campo hidden y lo llamo $i pero ya no se si ahi esta bien para que inserte en base de datos y no me lo hace...debe ser una peguita pequeña pero no me sube ni me inserta, os pongo el formulario y el código a ver si alguno veis que puede ser que ando atascadín, Gracias de antemano.


Código PHP:
<form action="" method="post" enctype="multipart/form-data" name="form1">
  <p><span class="Estilo8">Tipo:</span>
        <select name="tipo">
          <option value="Plano"> Plano</option>
          <option value="Texto"> Texto</option>
          <option value="Foto"> Foto</option>
          <option value="Video"> V&iacute;deo</option>
        </select>
      </p>
       <label for="id_documento" title="Expediente al que pertenece el archivo"><span class="Estilo8">Expediente </span></label>
       <span class="Estilo8"></span></span><span class="Estilo17">
      <input  name="expediente" type="text" id="expediente" size="5" />
      <br />    
      
      <span class="Estilo8">N&ordm; Archivos :</span> 
      <select name="cantidad"> 
                    <script type="text/javascript"> 
                    for(x=1;x<=10;x++){ 
                    document.write("<option value="+ x +">"+ x+"</option>"); 
                    } 
                    </script> 
      </select> 
      <input type="submit" name="Submit" value="Aceptar"><br> 
       

<?php     
 $uploaddir
=$_SERVER['DOCUMENT_ROOT']."/UPLOAD/"

if(isset(
$_POST['Submit'])){ 
        echo 
"<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold;'> Elegir Archivos para Subir<br>"
            for(
$i=1;$i<=$_POST['cantidad'];++$i){ 
                echo 
"<input type=\"file\" name=\"archivo[]\"><br>"
            } 
        echo 
"<input type=\"submit\" name=\"Submit2\" value=\"Subir\">"
        echo 
"<input type=\"hidden\" name=\"cant1\" value=\"$i\">"
    } 
     
    if(isset(
$_POST['Submit2'])){ 
        
$cantidad2 =count($_FILES["archivo"]); 
        for (
$j=0;$j<=$cantidad2;$j++){ 
                
$archivo $_FILES["archivo"]["tmp_name"][$j];  
                
$tamanio $_FILES["archivo"]["size"][$j]; 
                
$tipo    $_FILES["archivo"]["type"][$j]; 
                
$nombre  $_FILES["archivo"]["name"][$j]; 

                    
$x=$j
             do{ 
             
$x++; 
                if( 
$archivo != "" ){ 
                           
$fp fopen($archivo"rb"); 
                           
$contenido fread($fp$tamanio); 
                           
$contenido addslashes($contenido); 
                           
fclose($fp); 
                           
//Inserción en tablas BD
                           
                                           
$link=Conectarse(); 
                                        function 
quitar($mensaje
                                        { 
                                        
$mensaje str_replace("<","&lt;",$mensaje); 
                                        
$mensaje str_replace(">","&gt;",$mensaje); 
                                        
$mensaje str_replace("\'","'",$mensaje); 
                                        
$mensaje str_replace('\"',"&quot;",$mensaje); 
                                        
$mensaje str_replace("\\\\","\",$mensaje); 
                                        return 
$mensaje
                                        } 
                                        
$sql "INSERT INTO Documentos (id_documento,expediente,nombre,tipo)
                                         VALUES ("

                                        
$sql .= "'".quitar($HTTP_POST_VARS["$i"])."'"
                                        
$sql .= ",'".quitar($HTTP_POST_VARS["expediente"])."'"
                                        
$sql .= ",'".quitar($HTTP_POST_VARS["$archivo"])."'"
                                        
$sql .= ",'".quitar($HTTP_POST_VARS["tipo"])."'"
                                        
$sql .= ")"
                                        
mysql_query($sql); 
                                        
//header("Location: Alta_archivo_correcto.php");   
                                        
mysql_free_result($result); 
                                        
mysql_close(); 
                           
                            
//Fin Inserción en tablas BD
                           
                            
                           
if(copy($archivo$uploaddir.$nombre)) 
                                { 
                                 echo 
"<p style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold; float:center;'> El archivo $archivo ha sido cargado correctamente</p>";
                                } 
                           } 
                        }while(
$x<$j); 
             } 
        } 
        
?> 
</form>
  #2 (permalink)  
Antiguo 24/01/2009, 12:30
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Subida de varios de archivos

el do while estan de mas ya que vos necesitas recorrer cada uno de los archivos que subiste, y eso ya lo estas haciendo cuando realizas el for

Código PHP:
<form action="" method="post" enctype="multipart/form-data" name="form1"> 
  <p><span class="Estilo8">Tipo:</span> 
        <select name="tipo"> 
          <option value="Plano"> Plano</option> 
          <option value="Texto"> Texto</option> 
          <option value="Foto"> Foto</option> 
          <option value="Video"> V&iacute;deo</option> 
        </select> 
      </p> 
       <label for="id_documento" title="Expediente al que pertenece el archivo"><span class="Estilo8">Expediente </span></label> 
       <span class="Estilo8"></span></span><span class="Estilo17"> 
      <input  name="expediente" type="text" id="expediente" size="5" /> 
      <br />     
       
      <span class="Estilo8">N&ordm; Archivos :</span>  
      <select name="cantidad">  
                    <script type="text/javascript">  
                    for(x=1;x<=10;x++){  
                    document.write("<option value="+ x +">"+ x+"</option>");  
                    }  
                    </script>  
      </select>  
      <input type="submit" name="Submit" value="Aceptar"><br>  
        

<?php      
 $uploaddir
=$_SERVER['DOCUMENT_ROOT']."/UPLOAD/";  

if(isset(
$_POST['Submit'])){  
        echo 
"<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold;'> Elegir Archivos para Subir<br>";  
            for(
$i=1;$i<=$_POST['cantidad'];++$i){  
                echo 
"<input type=\"file\" name=\"archivo[]\"><br>";  
            }  
        echo 
"<input type=\"submit\" name=\"Submit2\" value=\"Subir\">";  
        echo 
"<input type=\"hidden\" name=\"cant1\" value=\"$i\">";  
    }  
      
    if(isset(
$_POST['Submit2'])){  
        
$cantidad2 =count($_FILES["archivo"]);  
        for (
$j=0;$j<=$cantidad2;$j++){  
                
$archivo $_FILES["archivo"]["tmp_name"][$j];   
                
$tamanio $_FILES["archivo"]["size"][$j];  
                
$tipo    $_FILES["archivo"]["type"][$j];  
                
$nombre  $_FILES["archivo"]["name"][$j];  

                if( 
$nombre != "" ){  
                           
$fp fopen($archivo"rb");  
                           
$contenido fread($fp$tamanio);  
                           
$contenido addslashes($contenido);  
                           
fclose($fp);  
                           
//Inserción en tablas BD 
                            
                                           
$link=Conectarse();  
                                        function 
quitar($mensaje)  
                                        {  
                                        
$mensaje str_replace("<","&lt;",$mensaje);  
                                        
$mensaje str_replace(">","&gt;",$mensaje);  
                                        
$mensaje str_replace("\'","'",$mensaje);  
                                        
$mensaje str_replace('\"',"&quot;",$mensaje);  
                                        
$mensaje str_replace("\\\\","\",$mensaje);  
                                        return $mensaje;  
                                        }  
                                        $sql = "
INSERT INTO Documentos (id_documento,expediente,nombre,tipo
                                         
VALUES (";  
                                        $sql .= "'".quitar($HTTP_POST_VARS["$i"])."'";  
                                        $sql .= "
,'".quitar($HTTP_POST_VARS["expediente"])."'";  
                                        $sql .= "
,'".quitar($HTTP_POST_VARS["$archivo"])."'";  
                                        $sql .= "
,'".quitar($HTTP_POST_VARS["tipo"])."'";  
                                        $sql .= "
)";  
                                        mysql_query($sql);  
                                        //header("
LocationAlta_archivo_correcto.php");    
                                        mysql_free_result($result);  
                                        mysql_close();  
                            
                                 //Fin Inserción en tablas BD 
                            
                             
                                if(copy($archivo, $uploaddir.$nombre))  
                                {  
                                 echo "
<p style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold; float:center;'El archivo $archivo ha sido cargado correctamente</p>"; 
                                }  
                           }  
             }  
        }  
        ?>  
</form>
y otra cosa, LA FUNCION QUITAR()

que hace???


y otra mas NO USES $HTTP_*_VARS eso ya es obsoleto, uliza $_POST o $_GET o $_FILES, segun sea el caso
  #3 (permalink)  
Antiguo 25/01/2009, 06:10
Avatar de Javiglez  
Fecha de Ingreso: marzo-2006
Ubicación: Valladolid
Mensajes: 496
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Subida de varios de archivos

korg1988 gracias por tu atención, la función quitar ya la he quitado era para subistituir posibles caracteres ya no hace falta...en cuanto a lo de obsoleto, en el caso de mi código me imagino que sera en vez de esto
Código PHP:
 $sql .= ",'".quitar($HTTP_POST_VARS["$archivo"])."'"
Código PHP:
 $sql .= ",'".$GET["$archivo"]."'"
corregidme si hay algo mal... y en cuanto al código pues es que yo no se si esta mal o bien que la variable que pasa oculta en el form el script $i la utilizo yo para insertarla como campo clave de mi tabla Documentos...El problema principal que tengo es que yo quiero una pantalla que suba varios archivos del mismo expediente..

el expediente se lo paso yo en el form...pero claro me tiene que recoger el nombre del archivo e insertarmelo en el campo nombre de la tabla documentos, el tipo de archivo que he metido otro select en el form y el id documento que es la clave de la tabla que es lo que creo que falla...no se si me explico bien...
Gracias por tu atención.
  #4 (permalink)  
Antiguo 25/01/2009, 10:36
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Subida de varios de archivos

primero

para $HTTP_POST_VARS(que es lo que vos estas usando ahi) tenes que usar $_POST
para $HTTP_GET_VARS tenes que usar $_GET

ejemplo $_POST['campo']

con respecto a subir varios archivos, vos lo que queres hacer es que ese archivo se suba varias veces para el mismo expediente? o subir varios archivos diferentes para el mismo expediente!
  #5 (permalink)  
Antiguo 25/01/2009, 14:53
Avatar de Javiglez  
Fecha de Ingreso: marzo-2006
Ubicación: Valladolid
Mensajes: 496
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Subida de varios de archivos

Cita:
Iniciado por korg1988 Ver Mensaje
primero

para $HTTP_POST_VARS(que es lo que vos estas usando ahi) tenes que usar $_POST
para $HTTP_GET_VARS tenes que usar $_GET

ejemplo $_POST['campo']

con respecto a subir varios archivos, vos lo que queres hacer es que ese archivo se suba varias veces para el mismo expediente? o subir varios archivos diferentes para el mismo expediente!
Tengo que subir varios archivos para el mismo expediente, digamos que tengo dos tablas, expedientes y documentos, y un expediente tiene varios documentos.. entonces la idea que he puesto de modificar el script que cogi es añadirle un campo expediente y un campo tipo de archivo entonces tengo que elegirlo en el formulario y pasarle esos valores para hacer el insert...también tengo que pasarle el id_documento que es la clave de la tabla documentos..

Lo sencillo es subir varios archivos al tuntun pero claro yo quiero insertarlos en BD, recoger el nombre del archivo e insertarlo en el campo nombre y así con los otros.
  #6 (permalink)  
Antiguo 25/01/2009, 15:09
Avatar de Javiglez  
Fecha de Ingreso: marzo-2006
Ubicación: Valladolid
Mensajes: 496
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Subida de varios de archivos

Código PHP:
<?php      
 $uploaddir
=$_SERVER['DOCUMENT_ROOT']."/UPLOAD/";  

if(isset(
$_POST['Submit'])){  
        echo 
"<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold;'> Elegir Archivos para Subir<br>";  
            for(
$i=1;$i<=$_POST['cantidad'];++$i){  
                echo 
"<input type=\"file\" name=\"archivo[]\"><br>";  
            }  
        echo 
"<input type=\"submit\" name=\"Submit2\" value=\"Subir\">";  
        echo 
"<input type=\"hidden\" name=\"cant1\" value=\"$i\">";  
    }  
      
    if(isset(
$_POST['Submit2'])){  
        
$cantidad2 =count($_FILES["archivo"]);  
        for (
$j=0;$j<=$cantidad2;$j++){  
                
$archivo $_FILES["archivo"]["tmp_name"][$j];   
                
$tamanio $_FILES["archivo"]["size"][$j];  
                
$tipo    $_FILES["archivo"]["type"][$j];  
                
$nombre  $_FILES["archivo"]["name"][$j];  

                if( 
$nombre != "" ){  
                           
$fp fopen($archivo"rb");  
                           
$contenido fread($fp$tamanio);  
                           
$contenido addslashes($contenido);  
                           
fclose($fp);  
                           
//Inserción en tablas BD 
                            
                                        
$link=Conectarse();  
                                       
                                        
$sql "INSERT INTO Documentos (id_documento,expediente,nombre,tipo) 
                                         VALUES ("
;  
                                        
$sql .= "'".$POST["$i"]."'";  
                                        
$sql .= ",'".$POST["expediente"]."'";  
                                        
$sql .= ",'".$POST["$archivo"]."'";  
                                        
$sql .= ",'".$POST["tipo"]."'";  
                                        
$sql .= ")";  
                                        
mysql_query($sql);  
                                        
//header("Location: Alta_archivo_correcto.php");    
                                        
mysql_free_result($result);  
                                        
mysql_close();  
                            
                                 
//Fin Inserción en tablas BD 
                            
                             
                                
if(copy($archivo$uploaddir.$nombre))  
                                {  
                                 echo 
"<p style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold; float:center;'> El archivo $archivo ha sido cargado correctamente</p>"
                                }  
                           }  
             }  
        }  
        
?>  
</form>
He hecho los cambios que me has comentado...lo que me estoy dando cuenta es que en el insert el nombre le paso $archivo y eso no es el nombre del archivo...para el nombre me supongo que tendré que recoger el nombre cortando de la ruta una vez que se ha adjuntado del explorador de windows pero no se si se puede hacer...como si fuera un substring de una cadena...no se si van por ahí los tiros o como lo puedo hacer...
  #7 (permalink)  
Antiguo 25/01/2009, 19:31
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Subida de varios de archivos

tendrias que cambiar esta linea

Código PHP:
$sql .= ",'".$POST["$archivo"]."'"
por esta

Código PHP:
$sql .= ",'".$nombre."'"
por otro lado no se para que tenes esto
Código PHP:
                 $fp fopen($archivo"rb");   
                           
$contenido fread($fp$tamanio);   
                           
$contenido addslashes($contenido);   
                           
fclose($fp); 
ya que $contenido no lo estas usando en ningun lado

para que se te aclaren algunos conceptos....

En tu script estas realizando dos cosas distintas para llegar a lo mismo
QUe quiero decir con esto???
Para guardar archivos hay dos formas (basicas)

1- guardarlo en binario en la base de datos
2-guardar el nombre del archivo en la base de datos y el archivo en un directorio

si vos te pones a mirar tu codigo tenes un procedimiento que es el que anote anteriormente donde usas addslashes() con el que estas obteniendo el contenido en binario del archivo, pero como se ve mas adelante en tu codigo NO LO USAS.. solo guardas el nombre (o al menos eso intentabas, porque como te hize corregir anteriormente, estabas guardando el nombre del archivo temporal! y no el nombre del archivo real...
Ahora si nos fijamos, mas adelante en tu codigo, tambien estas haciendo un COPY y eso es como realizar la segunda de las opciones de guardado de archivos que teniamos disponibles

Entoncces, por un lado estas leyendo el contenido binario, pero luego no lo guardas en ningun lado, y por otro lado estas copiando el archivo fisicamente en un directorio y guardando el nombre...

que es lo que realmente queres hacer?? guardar el archivo en una base de datos, o solo guardar el nombre en la base y el archivo en un directorio???


A.... y otra cosa!.... corregi tus variables $POST, ya que se escriben $_POST con guion bajo delante
Saludos!....
  #8 (permalink)  
Antiguo 26/01/2009, 13:06
Avatar de Javiglez  
Fecha de Ingreso: marzo-2006
Ubicación: Valladolid
Mensajes: 496
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Subida de varios de archivos

Hola korg gracias por tu paciencia, ya he corregido lo que me has dicho, no quiero guardarlo en binario, quiero guardar el nombre del archivo con su extensióna poder ser...lo del fopen estaba en el script que utilice y es cierto que ya nada...y cierto que es que también quiero copiarlo en la carpeta del servidor para que quede subido. pero lo que no se es como guardar el nombre del archivo en $nombre una vez que lo has adjuntado del explorador de windows, y luego ya poco me qudearía creo yo...por aqui me llego..

Código PHP:
<form action="" method="post" enctype="multipart/form-data" name="form1"> 
  <p><span class="Estilo8">Tipo:</span> 
        <select name="tipo"> 
          <option value="Plano"> Plano</option> 
          <option value="Texto"> Texto</option> 
          <option value="Foto"> Foto</option> 
          <option value="Video"> V&iacute;deo</option> 
        </select> 
      </p> 
       <label for="id_documento" title="Expediente al que pertenece el archivo"><span class="Estilo8">Expediente </span></label> 
       <span class="Estilo8"></span></span><span class="Estilo17"> 
      <input  name="expediente" type="text" id="expediente" size="5" /> 
      <br />     
       
      <span class="Estilo8">N&ordm; Archivos :</span>  
      <select name="cantidad">  
                    <script type="text/javascript">  
                    for(x=1;x<=10;x++){  
                    document.write("<option value="+ x +">"+ x+"</option>");  
                    }  
                    </script>  
      </select>  
      <input type="submit" name="Submit" value="Aceptar"><br>  
        

<?php      
 $uploaddir
=$_SERVER['DOCUMENT_ROOT']."/UPLOAD/";  

if(isset(
$_POST['Submit'])){  
        echo 
"<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold;'> Elegir Archivos para Subir<br>";  
            for(
$i=1;$i<=$_POST['cantidad'];++$i){  
                echo 
"<input type=\"file\" name=\"archivo[]\"><br>";  
            }  
        echo 
"<input type=\"submit\" name=\"Submit2\" value=\"Subir\">";  
        echo 
"<input type=\"hidden\" name=\"cant1\" value=\"$i\">";  
    }  
      
    if(isset(
$_POST['Submit2'])){  
        
$cantidad2 =count($_FILES["archivo"]);  
        for (
$j=0;$j<=$cantidad2;$j++){  
                
$archivo $_FILES["archivo"]["tmp_name"][$j];   
                
$tamanio $_FILES["archivo"]["size"][$j];  
                
$tipo    $_FILES["archivo"]["type"][$j];  
                
$nombre  $_FILES["archivo"]["name"][$j];  

                if( 
$nombre != "" ){  
                           
//Inserción en tablas BD 
                            
                                        
$link=Conectarse();  
                                       
                                        
$sql "INSERT INTO Documentos (id_documento,expediente,nombre,tipo) 
                                         VALUES ("
;  
                                        
$sql .= "'".$_POST["$i"]."'";  
                                        
$sql .= ",'".$_POST["expediente"]."'";  
                                        
$sql .= ",'".$nombre."'";   
                                        
$sql .= ",'".$_POST["tipo"]."'";  
                                        
$sql .= ")";  
                                        
mysql_query($sql);  
                                        
//header("Location: Alta_archivo_correcto.php");    
                                        
mysql_free_result($result);  
                                        
mysql_close();  
                            
                                 
//Fin Inserción en tablas BD 
                            
                             
                                
if(copy($archivo$uploaddir.$nombre))  
                                {  
                                 echo 
"<p style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000; font-weight: bold; float:center;'> El archivo $archivo ha sido cargado correctamente</p>"
                                }  
                           }  
             }  
        }  
        
?>  
</form>
  #9 (permalink)  
Antiguo 26/01/2009, 20:46
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Subida de varios de archivos

en esta linea estas tomando el nombre del archivo que seleccionaste con el campo de archivos del formulario

Código PHP:
$nombre  $_FILES["archivo"]["name"][$j]; 
y despues estas guardando ese dato en la linea que dice
Código PHP:
$sql .= ",'".$nombre."'"
y en lugar de la funcion copy me gusta usar move_uploaded_file(), los argumentos son los mismos
Código PHP:
if(move_uploaded_file($archivo$uploaddir.$nombre)) 
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 13:01.