Foros del Web » Programando para Internet » PHP »

Problema al subir archivos y operar con variables form

Estas en el tema de Problema al subir archivos y operar con variables form en el foro de PHP en Foros del Web. Hola a todos los del foro, estoy intentando subir un archivo. En un principio funciona pero he querido cambiar un par de cosas como poder ...
  #1 (permalink)  
Antiguo 08/06/2003, 08:13
 
Fecha de Ingreso: junio-2003
Mensajes: 102
Antigüedad: 14 años, 6 meses
Puntos: 0
Problema al subir archivos y operar con variables form

Hola a todos los del foro, estoy intentando subir un archivo. En un principio funciona pero he querido cambiar un par de cosas como poder elegir el directorio de destino(en forma local) y que me copie el archivo con el mismo nombre(esto es provisional).Si en una pagina uso $PHP_SELF ¿no puedo usar las variables de formulario para luego usarlas en funciones?.Alguien tiene alguna sugerencia?
Me da el siguiente error(logico):
Notice: Undefined variable: nuevaruta in C:\asp\php\upload.php on line 39
Notice: Undefined variable: elFichero in C:\asp\php\upload.php on line 40

-Upload.php:

<?
include('obtenerdirectorio.php');
include('obtenerarchivo.php');
if(!isset($cargar)){

?>
<HTML>
<HEAD>
<TITLE>Formulario de carga de ficheros</TITLE>
</HEAD>

<BODY>

<FORM NAME="elForm" METHOD="POST"
ACTION="<? echo $PHP_SELF; ?>?cargar=1"
ENCTYPE="multipart/form-data">
<U><I><B><H1>Elija el archivo que va a ser copiado:</H1></B></I></U><BR>
<TABLE WIDTH="80%" STYLE="font-family:Arial;font-size:9pt;">

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="elFichero" size=75></INPUT></TD>
</TR>

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="nuevaruta" size=75></INPUT></TD>
</TR>

<tr><td> </td></tr>
<tr><td> </td></tr>

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="SUBMIT" VALUE="Subir el fichero">
</TR>

</TABLE>

</FORM></BODY></HTML>

<? $directorio=obtenerdirectorio($nuevaruta);
$archivo=obtenerarchivo($elFichero); ?>
<?

}

#Aquí realizamos la carga del fichero
if(isset($cargar)){

#Le damos al fichero un nuevo nombre
$nuevositio = $directorio.$archivo;

#Lo copiamos
if(!copy($elFichero,$nuevositio)){
echo "NO SE HA PODIDO SUBIR EL FICHERO";
}
else{
echo "FICHERO SUBIDO CON ÉXITO";
}

}

?>

-Obtenerdirectorio.php:
<HTML>
<HEAD>
<TITLE> Manejo de cadenas </TITLE>
</HEAD>

<BODY BGCOLOR="#FFFFFF">
<?

function obtenerdirectorio($nuevaruta)
{
//Programa para cortar una cadena para obtener el directorio anterior
$path="$nuevaruta";
$n=0;
$longitud=strlen($path);
for($i=0;$i<=$longitud;$i++)
{

$matriz[0][$i]=substr($path,$i,1);

}
for($i=$longitud;$i>=0;$i--)
{
$n=$n+1;
if ($matriz[0][$i] == '\\')
{
break;
}
}
$n=$n-2;?><BR>

<?
$longitud=$longitud-$n;
$path=substr($path,0,$longitud);
return $path;
}
?>
</BODY>
</HTML>

-obtenerarchivo.php:

<HTML>
<HEAD>
<TITLE> Obtener archivo de una cadena </TITLE>
</HEAD>

<BODY BGCOLOR="#FFFFFF">
<? function obtenerarchivo ($elFichero)
{
//Programa para cortar una cadena para obtener el archivo.
$path="$elFichero";
$n=0;
$longitud=strlen($path);
for($i=0;$i<=$longitud;$i++)
{

$matriz[0][$i]=substr($path,$i,1);
echo "{$matriz[0][$i]}";

}
for($i=$longitud;$i>=0;$i--)
{
$n=$n+1;
if ($matriz[0][$i] == '\\')
{
break;
}
}
$n=$n-1;?><BR>

<?
$longitud=$longitud-$n;
$longitud=$longitud+1;
$path=substr($path,$longitud);
return $path;
}
?>
</BODY>
</HTML>
  #2 (permalink)  
Antiguo 08/06/2003, 14:16
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Tu "problema" es que intentas leer el valor de variables que no estan definidas. En concreto, estas dos que comentas solo pueden estar definidas despues de enviar el formulario. La primera vez que cargas la pagina te sale el error. Yo moveria esas dos lineas despues de la llave que cierra el if (!isset($cargar)), o lo que es lo mismo, dentro del if (isset($cargar)) porque sino se van a ejecutar solo cuando se muestra el formulario, que creo que no es lo que pretendes.

Por cierto, si tus includes solo tienen funciones PHP, no deberian tener nada de HTML. Con eso estas logrando que tu HTML no sea totalmente valido.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 09/06/2003, 10:19
 
Fecha de Ingreso: junio-2003
Mensajes: 102
Antigüedad: 14 años, 6 meses
Puntos: 0
Josemi, gracias por tus indicaciones.Creo que todo el codigo es correcto, pero no hay manera de cambiar el directorio destino y que coja el mismo nombre de archivo.
Un saludo a todos de nuevo,quiero subir(copiar) un archivo pero si quieres cambiar la ruta y el
nombre del archivo usando variables no te deja,pero usando una cadena fija.Sabeis si usando $PHP_SELF en el action
se pueden usar las variables de formulario?Gracias.Las funciones van bien, ya que he tenido que convertir
\ por / que es la que acepta $nuevositio.Si pones $nuevositio=C:/asp/php/nom_fich.000 si que funciona.
Mas abajo os ponga las funciones.

C:\PHP\uploadtemp\php8.tmp

C:/PHP/uploadtemp/ -->directorio que quiero cambiar
php8.tmp -->nombre archivo uso una funcion para que sea el mismo que antes.
C:/PHP/uploadtemp/php8.tmp
NO SE HA PODIDO SUBIR EL FICHERO
-upload2.php:
<?
include('obtenerdirectoriobarra7.php');
include('obtenerarchivo.php');
if(!isset($cargar)){
?>
<HTML>
<HEAD>
<TITLE>Formulario de carga de ficheros(Copiar ficheros)</TITLE>
</HEAD>

<BODY>

-obetenerdirectoriobarra7.php:
<?

function obtenerdirectorio($nuevaruta)
{
//Programa para cortar una cadena para obtener el directorio anterior
$path="$nuevaruta";
$ruta="";
$n=0;
$longitud=strlen($path);
for($i=0;$i<=$longitud;$i++)
{

$matriz[0][$i]=substr($path,$i,1);
if ($matriz[0][$i] == '\\')
{
$matriz[0][$i]='/';
}
$ruta=$ruta . $matriz[0][$i];
}
for($i=$longitud;$i>=0;$i--)
{
$n=$n+1;
if ($matriz[0][$i] == '/')
{
break;
}
}
$n=$n-2;?><BR>

<?
$longitud=$longitud-$n;
$ruta=substr($ruta,0,$longitud);
return $ruta;
}
?>

-obtenerarchivo.php:
<?
function obtenerarchivo($elFichero)
{
//Programa para cortar una cadena para obtener el archivo.
$path="$elFichero";
$n=0;
$longitud=strlen($path);
for($i=0;$i<=$longitud;$i++)
{

$matriz[0][$i]=substr($path,$i,1);
echo "{$matriz[0][$i]}";

}
for($i=$longitud;$i>=0;$i--)
{
$n=$n+1;
if ($matriz[0][$i] == '\\')
{
break;
}
}
$n=$n-1;?><BR>

<?
$longitud=$longitud-$n;
$longitud=$longitud+1;
$path=substr($path,$longitud);
return $path;
}
?>
<FORM NAME="elForm" METHOD="POST"
ACTION="<? echo $PHP_SELF; ?>?cargar=1"
ENCTYPE="multipart/form-data">
<U><I><B><H1>Elija el archivo que va a ser copiado:</H1></B></I></U><BR>
<TABLE WIDTH="80%" STYLE="font-family:Arial;font-size:9pt;">

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="elFichero" size=75></INPUT></TD>
</TR>

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="nuevaruta" size=75></INPUT></TD>
</TR>

<tr><td> </td></tr>
<tr><td> </td></tr>

<TR>
<TD ALIGN="LEFT"><INPUT TYPE="SUBMIT" VALUE="Subir el fichero">
</TR>

</TABLE>

</FORM></BODY></HTML>

<?

}

#Aquí realizamos la carga del fichero
if(isset($cargar)){
$directorio=obtenerdirectorio($nuevaruta);
$archivo=obtenerarchivo($elFichero);
echo "<br> $directorio";
echo "<br> $archivo <br>";
#Le damos al fichero un nuevo nombre
$nuevositio = $directorio . $archivo; //Eliges la ruta donde quieres que se copie el archivo con nuevo nombre
echo "$nuevositio <br>"; //Si solo pones nombre archivo los pone C:/asp/php/ejercicios(esto slo a mi)
#Lo copiamos //Para pasar la ruta de input=file(C:\asp\php\ejercicios por ejemplo) uso obtenerdirectoriobarra7.php
if(!copy($elFichero,$nuevositio)){
echo "NO SE HA PODIDO SUBIR EL FICHERO";
}
else{
echo "FICHERO SUBIDO CON ÉXITO";
}

}

?>
  #4 (permalink)  
Antiguo 09/06/2003, 14:17
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
A ver, creo que no has entendido como van las variables de upload de ficheros. Para cada fichero se crean cuatro variables (si el campo se llama fichero):

- $fichero: es la ruta y el nombre del fichero temporal donde almacena PHP el fichero subido.

- $fichero_name: el nombre original del fichero (sin la ruta) que tenia en el equipo origen.

- $fichero_type: el tipo MIME del fichero.

- $fichero_size: el tamaño del fichero.

Como ves, en ningun sitio se almacenan los valores que aparecen en la caja de texto del formulario. Esos valores son los datos en el cliente, que a PHP no le importan (quitando el nombre del fichero).

Es decir, si quieres poner un archivo en un directorio en concreto, el nuevo directorio deberias pasarlo en un TEXT, no en un FILE, y deberias usar copy($fichero,$nuevaruta.$fichero_name).

Revisa http://www.php.net/manual/en/features.file-upload.php

Espero haber sido de ayuda.

PD: En el formulario, al darle a explorar, explora el equipo del cliente no el servidor.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
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 11:29.