Foros del Web » Programando para Internet » PHP »

no hay manera de subir archivos!!

Estas en el tema de no hay manera de subir archivos!! en el foro de PHP en Foros del Web. HOla buenas a tod@s!! vereis tengo un problema que me trae de cabeza!! y lo peor es que habre hecho scripts similares cientos de veces!! ...
  #1 (permalink)  
Antiguo 15/09/2008, 04:36
Avatar de the_feti  
Fecha de Ingreso: julio-2005
Mensajes: 82
Antigüedad: 18 años, 9 meses
Puntos: 0
no hay manera de subir archivos!!

HOla buenas a tod@s!!

vereis tengo un problema que me trae de cabeza!! y lo peor es que habre hecho scripts similares cientos de veces!! pero esta vez quise hacer uno para subir multiples archivos a la vez y saque uno de por aqui que me parecio bastante bien. La cuestion es que me da un error y no soy capaz de dar con el, seguro que es una tonteria pero es que ya estoy saturado! os pongo el codigo!

Este es el formulario que uso para recojer los datos: (este no me da ningun problema)
Código HTML:
<script type="text/javascript">
var numero = 0; //Esta es una variable de control para mantener nombres
            //diferentes de cada campo creado dinamicamente.
evento = function (evt) { //esta funcion nos devuelve el tipo de evento disparado
   return (!evt) ? event : evt;
}

//Aqui se hace lamagia... jejeje, esta funcion crea dinamicamente los nuevos campos file
addCampo = function () { 
//Creamos un nuevo div para que contenga el nuevo campo
   nDiv = document.createElement('div');
//con esto se establece la clase de la div
   nDiv.className = 'archivo';
//este es el id de la div, aqui la utilidad de la variable numero
//nos permite darle un id unico
   nDiv.id = 'file' + (++numero);
//creamos el input para el formulario:
   nCampo = document.createElement('input');
//le damos un nombre, es importante que lo nombren como vector, pues todos los campos
//compartiran el nombre en un arreglo, asi es mas facil procesar posteriormente con php
   nCampo.name = 'archivos[]';
//Establecemos el tipo de campo
   nCampo.type = 'file';
//Ahora creamos un link para poder eliminar un campo que ya no deseemos
   a = document.createElement('a');
//El link debe tener el mismo nombre de la div padre, para efectos de localizarla y eliminarla
   a.name = nDiv.id;
//Este link no debe ir a ningun lado
   a.href = '#';
//Establecemos que dispare esta funcion en click
   a.onclick = elimCamp;
//Con esto ponemos el texto del link
   a.innerHTML = 'Eliminar';
//Bien es el momento de integrar lo que hemos creado al documento,
//primero usamos la función appendChild para adicionar el campo file nuevo
   nDiv.appendChild(nCampo);
//Adicionamos el Link
   nDiv.appendChild(a);
//Ahora si recuerdan, en el html hay una div cuyo id es 'adjuntos', bien
//con esta función obtenemos una referencia a ella para usar de nuevo appendChild
//y adicionar la div que hemos creado, la cual contiene el campo file con su link de eliminación:
   container = document.getElementById('adjuntos');
   container.appendChild(nDiv);
}
//con esta función eliminamos el campo cuyo link de eliminación sea presionado
elimCamp = function (evt){
   evt = evento(evt);
   nCampo = rObj(evt);
   div = document.getElementById(nCampo.name);
   div.parentNode.removeChild(div);
}
//con esta función recuperamos una instancia del objeto que disparo el evento
rObj = function (evt) { 
   return evt.srcElement ?  evt.srcElement : evt.target;
}
</script>
<?php
$album=$_GET["album"]; ?>

		  		<table cellpadding="1" cellspacing="1" align="center" width="80%" border="0">
        			<tr>
          				<td colspan="2" align="center">
		  					<span class="textoblanco"><b>Sube las fotos al album <?=$_GET["album"]?></b></span> <br>
		  					<br>
						</td>
        			</tr>
					<tr>
          				<td colspan="2" align="center">
		  					<form name="formu" id="formu" action="upload.php" method="post" enctype="multipart/form-data">
							<input type="hidden" name="album" value="<?=$_GET["album"]?>">
     <dl>            
   <dt><label>Archivos a Subir:</label></dt>
        <!-- Esta div contendrá todos los campos file que creemos -->
   <dd><div id="adjuntos">
        <!-- Hay que prestar atención a esto, el nombre de este campo debe siempre terminar en []
        como un vector, y ademas debe coincidir con el nombre que se da a los campos nuevos 
        en el script -->
   <input type="file" name="archivos[]" /><br />
   </div></dd>
   <dt><a href="#" onClick="addCampo()">Subir otro archivo</a></dt>      
   <dd><input type="submit" value="Enviar" id="envia" name="envia" /></dd>
     </dl>
</form> 
el problema viene aqui, es el archivo upload.php que uso para subir los archivos:

Código PHP:
<?php 
   
//Preguntamos si nuetro arreglo 'archivos' fue definido
         
$album=$_POST["album"];
         
$ruta'albums/'.$_POST["album"].'/images/'.$_FILES["archivos"]["name"][$i];
        
         if (isset (
$_FILES["archivos"])) {
         
//de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
         //obtenemos la cantidad de elementos que tiene el arreglo archivos
         
$tot count($_FILES["archivos"]["name"]);
         
//este for recorre el arreglo
         
for ($i 0$i $tot$i++){
         
//con el indice $i, poemos obtener la propiedad que desemos de cada archivo
         //para trabajar con este
         
if(is_uploaded_file($_FILES["archivos"]["tmp_name"][$i])){
                            
move_uploaded_file($_FILES["archivos"]["tmp_name"][$i],$ruta);
                                
//$foto = 'albums/'.$album.'/images'.$_FILES["archivos"]["name"][$i];
                        
}
            
$tmp_name $_FILES["archivos"]["tmp_name"][$i];
            
$name $_FILES["archivos"]["name"][$i];
            echo(
"<b>Archivo </b> $key ");
            echo(
"<br />");
            echo(
"<b>el nombre original:</b> ");
            echo(
$name);
            echo(
"<br />");
            echo(
"<b>el nombre temporal:</b> \n");
            echo(
$tmp_name);
            echo(
"<br />");            
            }
      }      
?>
y aqui el error que me devuelve:

Código:
Warning: move_uploaded_file(albums/Fotos del mes/images/) [function.move-uploaded-file]: failed to open stream: Is a directory in /homepages/37/d242400046/htdocs/upload.php on line 15

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpO0pfYT' to 'albums/Fotos del mes/images/' in /homepages/37/d242400046/htdocs/upload.php on line 15
Archivo
el nombre original: +gas_marco_17.jpg
el nombre temporal: /tmp/phpO0pfYT

Warning: move_uploaded_file(albums/Fotos del mes/images/) [function.move-uploaded-file]: failed to open stream: Is a directory in /homepages/37/d242400046/htdocs/upload.php on line 15

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpmU8XND' to 'albums/Fotos del mes/images/' in /homepages/37/d242400046/htdocs/upload.php on line 15
Archivo
el nombre original: +gas_marco_11.jpg
el nombre temporal: /tmp/phpmU8XND
ya no se que probar, he probado poner "./" antes de la ruta, he mirado los permisos y desde el mismo ftp puse las carpetas de destino: albums/images en 777, pero nada, ya no s que puede ser.

Gracias!!
  #2 (permalink)  
Antiguo 15/09/2008, 05:19
 
Fecha de Ingreso: diciembre-2006
Mensajes: 57
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: no hay manera de subir archivos!!

Revisa los premisos del usuario del FTP
  #3 (permalink)  
Antiguo 15/09/2008, 05:21
 
Fecha de Ingreso: diciembre-2006
Mensajes: 57
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: no hay manera de subir archivos!!

----------
  #4 (permalink)  
Antiguo 15/09/2008, 05:33
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: no hay manera de subir archivos!!

Hola:

A simple vista pones el índice detrás del atributo tmp_name, y creo que tendría que ser al revés:

así lo tienes...
Código:
if(is_uploaded_file($_FILES["archivos"]["tmp_name"][$i])){
... i creo que debería ser así:
Código:
if(is_uploaded_file($_FILES["archivos"][$i]["tmp_name"])){
Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 16/09/2008, 05:20
Avatar de the_feti  
Fecha de Ingreso: julio-2005
Mensajes: 82
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: no hay manera de subir archivos!!

Pues muchas gracias por las respuestas, en principio haciendo lo que me ha dicho caricatos parece que he solucionado los warniings! pero sigue sin chutar!!
Los warning dejaron de salir, pero al ir a buscar el archivo a su destino , no estaba!! entonces decidi imprimir los resultados del is_uploaded_file y es hay donde falla, luego intente imprimir todo el $_files y los resultados parecen bien... no se opinad vosotros!

este es el codigo php modificado:

Código PHP:
<?php 
   
//Preguntamos si nuetro arreglo 'archivos' fue definido
         
$album=$_POST["album"];
         
$ruta"albums/".$_POST["album"]."/images/".$_FILES["archivos"][$i]["name"];
        
         if (isset (
$_FILES["archivos"])) {
         
//de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
         //obtenemos la cantidad de elementos que tiene el arreglo archivos
         
$tot count($_FILES["archivos"]["name"]);
         echo 
$tot;
         
print_r($_FILES);
         
//este for recorre el arreglo
         
for ($i 0$i $tot$i++){
         
//con el indice $i, poemos obtener la propiedad que desemos de cada archivo
         //para trabajar con este
         
if(is_uploaded_file($_FILES["archivos"][$i]["tmp_name"])){
                            
move_uploaded_file($_FILES["archivos"][$i]["tmp_name"],$ruta);
                                
//$foto = 'albums/'.$album.'/images'.$_FILES["archivos"]["name"][$i];
                                
echo " <br /> bieeeenn <br />";
                        }else{
                        echo 
"<br /> maaal <br />";}
            
$tmp_name $_FILES["archivos"]["tmp_name"][$i];
            
$name $_FILES["archivos"]["name"][$i];
            echo(
"<b>Archivo </b> $key ".$ruta);
            echo(
"<br />");
            echo(
"<b>el nombre original:</b> ");
            echo(
$name);
            echo(
"<br />");
            echo(
"<b>el nombre temporal:</b> \n");
            echo(
$tmp_name);
            echo(
"<br />");            
            }
      }      
?>
y bueno, aqui os dejo los resultados de todo lo que me devuelve:

2Array ( [archivos] => Array ( [name] => Array ( [0] => +gas_marco_18.jpg [1] => +gas_guardarrailes.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => C:\windows\TEMP\php7410.tmp [1] => C:\windows\TEMP\php7411.tmp ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 1066 [1] => 45185 ) ) )
maaal
Archivo albums/prueba1/images/
el nombre original: +gas_marco_18.jpg
el nombre temporal: C:\windows\TEMP\php7410.tmp

maaal
Archivo albums/prueba1/images/
el nombre original: +gas_guardarrailes.jpg
el nombre temporal: C:\windows\TEMP\php7411.tmp
  #6 (permalink)  
Antiguo 16/09/2008, 07:43
Avatar de the_feti  
Fecha de Ingreso: julio-2005
Mensajes: 82
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: no hay manera de subir archivos!!

Bueno, al final ya lo e solucionado!!

el indice debia ir al final como yo lo tenia antes porque si no no me reconocia los archivos, y el problema era al escribir la ruta, que no me cogia el nombre del archivo al final y el fallo que me daba al principio (failed to open stream: Is a directory in..) era porque al no cojerme bien el nombre del archivo lo que intentaba mover era un directorio y por eso me daba el error.

Al final mi codigo a quedado asi, por si a alguien le sirve de ayuda:

Código PHP:
<?php 
   
//Preguntamos si nuetro arreglo 'archivos' fue definido
         
$album=$_POST["album"];
         
chmod("albums/".$_POST["album"]."/images/",0777);
        
         if (isset (
$_FILES["archivos"])) {
         
//de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
         //obtenemos la cantidad de elementos que tiene el arreglo archivos
         
$tot count($_FILES["archivos"]["name"]);
         echo 
$tot;
         
print_r($_FILES);
         
//este for recorre el arreglo
         
for ($i 0$i $tot$i++){
         
//con el indice $i, poemos obtener la propiedad que desemos de cada archivo
         //para trabajar con este
         
if(is_uploaded_file($_FILES["archivos"]["tmp_name"][$i])){
                              
$ruta'albums/'.$_POST["album"].'/images/'.$_FILES["archivos"]["name"][$i];
                            if(
move_uploaded_file($_FILES["archivos"]["tmp_name"][$i],$ruta)){
                                echo 
"todo ok /n <a href=\"$ruta\"> imgen </a>"
                                
                            }else{
                                echo 
"vaya truño";
                            }
                                
//$foto = 'albums/'.$album.'/images'.$_FILES["archivos"]["name"][$i];
                                
echo " <br /> bieeeenn <br />";
                        }else{
                        echo 
"<br /> maaal <br />";}
            
$tmp_name $_FILES["archivos"]["tmp_name"][$i];
            
$name $_FILES["archivos"]["name"][$i];
            echo(
"<b>Archivo </b> $key ".$ruta);
            echo(
"<br />");
            echo(
"<b>el nombre original:</b> ");
            echo(
$name);
            echo(
"<br />");
            echo(
"<b>el nombre temporal:</b> \n");
            echo(
$tmp_name);
            echo(
"<br />");            
            }
      }      
?>
Gracias por todo
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 00:24.