Foros del Web » Programando para Internet » PHP »

Problema con Upload de ficheros

Estas en el tema de Problema con Upload de ficheros en el foro de PHP en Foros del Web. Hola foreros, tengo un problema con un formulario de upload de archivos debido a un cambio de servidor, en el antiguo servidor tenía "register_globals en ...
  #1 (permalink)  
Antiguo 24/10/2004, 04:02
Avatar de damargon  
Fecha de Ingreso: junio-2003
Ubicación: Madrid
Mensajes: 386
Antigüedad: 14 años, 5 meses
Puntos: 3
Exclamación Problema con Upload de ficheros

Hola foreros, tengo un problema con un formulario de upload de archivos debido a un cambio de servidor, en el antiguo servidor tenía "register_globals en off" y ahora las tengo "en On"... y no tengo ni idea de como cambiarlas.

Tengo en la página "form.htm" el siguiente formulario:
Titular: <input name="Titular" type="text" id="Titular" value="" size="50>
Texto:<textarea name="Texto" cols="40" rows="5" id="Texto"></textarea>
Foto asociada:<input name="file" type="file" class="campos"></input>

Y el script de recogida de datos es el siguiente:
<?php
session_start();

$_SESSION['texto']=str_replace("\n", "<br>", $_POST['Texto']);
$_SESSION['titular']=str_replace("&quot;", "'", $_POST['Titular']);

$file_name = str_replace(' ','%20',$file_name);

if($file_name !="") //AQUI ESTÁ EL PROBLEMA, ESTA VARIABLE NO TOMA NINGUN VALOR Y ENTONCES NO HACE NADA
{
copy("$file", "/home/httpd/vhosts/midominio.com/httpdocs/images/noticias/$file_name")
or die("No se puedo copiar la imagen");

list($ancho, $altura, $tipo, $attr) = getimagesize("/home/httpd/vhosts/midominio.com/httpdocs/images/noticias/$file_name");

$height=(($altura*200)/$ancho);

if ($tipo==2){
$abc = imagecreatefromjpeg("../../images/noticias/$file_name"); //creamos una imagen nueva a partir de la que se menciona
$def = imagecreatetruecolor(200, $height); //creamos el marco de una imagen en blanco del tamaño referido
//echo "La imagen es un JPEG";
}
elseif ($tipo==1)
{
$abc = imagecreatefromgif("../../images/noticias/$file_name"); //creamos una imagen nueva a partir de la que se menciona
$def = imagecreate(200, $height); //creamos el marco de una imagen en blanco del tamaño referido
//echo "La imagen es un GIF";
}
else
{
$_SESSION['img_invalid']=true;
header("Location:../noticias.php");
exit;
}

imagecopyresized($def, $abc, 0, 0, 0, 0, 200, $height, $ancho, $altura); //copia una porción rectangular de la imagen $abc en $def desde las coordenadas tal y un tamaño pascual

imagejpeg($def, "../../images/noticias/$file_name", 85); //la imagen creada con el imagecopyresized es producida, se le da un nombre y una calidad 85%
ImageDestroy($abc); //destruye la imagen temporal para liberar recursos del server

ImageDestroy($def); //destruye la imagen temporal para liberar recursos del server
?>

El problema es que no me sube la imagen, debido a lo que comentaba de las register_globals, el resto del script funciona bien.

A ver si alguien me puede decir cómo recoger el valor del campo "file".

Muchas gracias.

Última edición por damargon; 24/10/2004 a las 04:04
  #2 (permalink)  
Antiguo 24/10/2004, 09:04
 
Fecha de Ingreso: diciembre-2003
Mensajes: 213
Antigüedad: 14 años
Puntos: 0
Pues yo creo que lo que tienes es que usar la variable

$_FILE (Es predefinida y es un array)

Para comprobar que es lo que contiene haz un print_r($_FILE)

Me parece qe para tu caso tienes que acceder asi $_FILE["file"]["file_name"]

Pero si tu pregunta es cómo cambiar las register_globals a off u on tienes que editar el fichero php.ini y cambiarlo alli.

Ahora que recuerdo no me acuerdo muy bien de si la variable se llama $_FILE o $FILES
pero vamos una de las dos seguro.

Ademas comprueba si el formulario HTML esta bien definido, porque no lo has puesto en el mensaje.
  #3 (permalink)  
Antiguo 24/10/2004, 10:00
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 9 meses
Puntos: 0
kurlax la única forma de cambiarlo no es desde el php.ini. Aca te comento otra:

Creas un archivo .htaccess dentro del directorio, con el siguiente contenido por ejemplo

Código:
<IfModule mod_php4.c>
	php_flag register_globals off
</IfModule>
Salu2 :)
  #4 (permalink)  
Antiguo 25/10/2004, 01:19
Avatar de damargon  
Fecha de Ingreso: junio-2003
Ubicación: Madrid
Mensajes: 386
Antigüedad: 14 años, 5 meses
Puntos: 3
Gracias Kurlax,he probado a hacer lo que me dices y en la línea que pone:
$file_name = str_replace(' ','%20',$file_name);

he puesto lo siguiente:
$file_name = str_replace(' ','%20',$HTTP_POST_FILES['file', 'file_name']);

y también:
$file_name = str_replace(' ','%20',$_FILES['file', 'file_name']);

y nada, sigue sin recoger el archivo enviado desde el form y su nombre...

Gracias Appletalk por tu sugerencia pero ya que estoy prefiero seguir programando bajo register_globals on, que según parece es mucho más seguro y suele venir por defecto ahora este valor.

Alguna sugerencia más??

Gracias chicos.
  #5 (permalink)  
Antiguo 25/10/2004, 06:15
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,
Cita:
Gracias Appletalk por tu sugerencia pero ya que estoy prefiero seguir programando bajo register_globals on, que según parece es mucho más seguro y suele venir por defecto ahora este valor.
Es a OFF como es mas seguro, y es como viene ahora por defecto.

Creo que se te ha olvidado porner una linea muy importante: el <form>.

Y por cierto,
Código PHP:
$file_name str_replace(' ','%20',$_FILES['file''file_name']); 
asi no es como se usa $_FILES. Mira http://es.php.net/manual/en/features.file-upload.php

Saludos.

PD: Si has puesto esa linea y no te ha mostrado un error de sintaxis, entonces es que tienes configurado PHP para que no muestre los errores. Y eso durante el desarrollo tendria que estar activado. Mira error_reporting() (www.php.net/error_reporting).
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 25/10/2004 a las 06:16
  #6 (permalink)  
Antiguo 01/11/2004, 09:23
 
Fecha de Ingreso: noviembre-2004
Mensajes: 1
Antigüedad: 13 años, 1 mes
Puntos: 0
De acuerdo Posible solución

Hola,

Pues bien, he tenido el mismo problema que tú, y después de mirar en este foro y visitar el link del moderador, casualmente me he fijado en que el ejemplo de php.net incluye en el tag del <form> una propiedad que no había puesto::: <form enctype="multipart/form-data" ...> ::: EL TIPO DE DATOS!!!

No se si es esto lo que te falla pero a mi me ha solucionado el problema!

Ala, taluego!
  #7 (permalink)  
Antiguo 01/11/2004, 11:25
Avatar de damargon  
Fecha de Ingreso: junio-2003
Ubicación: Madrid
Mensajes: 386
Antigüedad: 14 años, 5 meses
Puntos: 3
Hola gracias por vuestras sugerencias.

Al final cambié el script entero y ya me funciona.

Lo de la etiqueta form que no figura en el código en mi primer mensaje sencillamente se me pasó ponerla, pero en el script sí la tenía.
  #8 (permalink)  
Antiguo 01/11/2004, 20:36
 
Fecha de Ingreso: octubre-2004
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Cita:
Iniciado por damargon
Hola gracias por vuestras sugerencias.

Al final cambié el script entero y ya me funciona.

Lo de la etiqueta form que no figura en el código en mi primer mensaje sencillamente se me pasó ponerla, pero en el script sí la tenía.
si podes poner como quedo el script que funciona ahora te lo agradeceria, ya que quiero hacer algo similar y no encuentro como.
  #9 (permalink)  
Antiguo 03/11/2004, 01:22
Avatar de damargon  
Fecha de Ingreso: junio-2003
Ubicación: Madrid
Mensajes: 386
Antigüedad: 14 años, 5 meses
Puntos: 3
Información

Ok, aquí os lo pongo funcionando, seguramente que será muy mejorable, si alguien puede colaborar más podemos hacer un script realmente potente. Este código no sólo sube la imagen donde tú le digas, sino que optimiza la imagen al tamaño que tú quieras y con la calidad elegida.

Este sería el formulario en el archivo form.php:
************************************************** *
<form action="upload.php" method="post" enctype="multipart/form-data" name="form">
<input name="userfile" type="file" class="campos"></input>
</form>
<?php //Pintamos los resultados del proceso
if ($_SESSION['nueva_imagen']==true) {
echo "<br><font color=ff0000><strong>La imagen ha sido correctamente subida</strong></font>";
$_SESSION['nueva_noticia']=false;

}
if ($_SESSION['img_invalid']==true)
{
echo "<br><font color=ff0000><strong>Solo son válidas imágenes con extensión '.jpg' y '.gif'.</strong></font>";
$_SESSION['img_invalid']=false;

}
if ($_SESSION['size_invalid']==true)
{
echo "<br><font color=ff0000><strong>Las imágenes no pueden ser mayores de 300Kb, por favor, reduce la imagen en un programa de edición.</strong></font>";
$_SESSION['size_invalid']=false;
}
?>
************************************************** *

Y este el archivo upload.php:
************************************************** *
<?php
//Configuramos la ruta donde se van a guardar las imágenes.
$upload_dir = "images/";


if($_FILES['userfile'] !="") //chequeamos que el campo file del form no está vacío
{
//obtenemos los datos del archivo subido
$temp_name = $_FILES['userfile']['tmp_name'];
$file_name = $_FILES['userfile']['name'];
$file_type = $_FILES['userfile']['type'];
$file_size = $_FILES['userfile']['size'];
$result = $_FILES['userfile']['error'];
$file_path = $upload_dir.$file_name;

if($file_size>350000) //este dato lo he ido ajustando a la configuración del php de mi servidor, por que si lo pongo más grande me da error
{
$_SESSION['size_invalid']=true; //esta sesión la utilizo para pintar el mensaje de error en la página del formulario
header("Location:form.php"); //vuelvo al formulario para que elija un archivo menor
exit;
}
elseif($file_size==0)
{
exit; //si el tamaño del archivo es 0 entonces que se salga del script.
}
else
{
$result = move_uploaded_file($temp_name, $file_path); //subimos el archivo a la carpeta indicada
list($ancho, $altura, $tipo, $attr) = getimagesize("/RutaFisicaDelDominio/images/$file_name"); //extraemos los atributos físicos de la imagen

$height=(($altura*200)/$ancho); //el tamaño al que yo realizo el resize de la imagen es de 200, lo puedes modificar a tu gusto

if ($tipo==2){ //si la imagen es de tipo 2 entonces es JPG
$abc = imagecreatefromjpeg("images/$file_name"); //creamos una imagen nueva a partir de la que se menciona
$def = imagecreatetruecolor(200, $height); //creamos el marco de una imagen en blanco del tamaño referido

}
elseif ($tipo==1) //Si la imagen es de tipo 1 es GIF
{
$abc = imagecreatefromgif("images/$file_name"); //creamos una imagen nueva a partir de la que se menciona
$def = imagecreate(200, $height); //creamos el marco de una imagen en blanco del tamaño referido
}
else
{
$_SESSION['img_invalid']=true;
header("Location:form.php");
exit;
}

imagecopyresized($def, $abc, 0, 0, 0, 0, 200, $height, $ancho, $altura); //copia una porción rectangular de la imagen $abc en $def
imagejpeg($def, "images/$file_name", 85); //la imagen creada con el imagecopyresized es producida, se le da un nombre y una calidad 85%
}
}

$_SESSION['nueva_imagen']=true;
header("Location:form.php");
exit;
?>

Pues creo que eso es todo, espero que os sirva.

Saludos.


************************************************** *
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:10.