Foros del Web » Programando para Internet » PHP »

Problemas con upload

Estas en el tema de Problemas con upload en el foro de PHP en Foros del Web. Hola a todos. Tengo unproblema al intentar un upload a traves de un formu. Este es el formu: <FORM ENCTYPE="multipart/form-data" ACTION="guardaArchivo.php" METHOD="post"> <INPUT type="hidden" name="lim_tamano" ...
  #1 (permalink)  
Antiguo 01/10/2003, 11:15
Avatar de Sir Kevin  
Fecha de Ingreso: julio-2003
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 20 años, 8 meses
Puntos: 0
Problemas con upload

Hola a todos.

Tengo unproblema al intentar un upload a traves de un formu.

Este es el formu:

<FORM ENCTYPE="multipart/form-data" ACTION="guardaArchivo.php" METHOD="post">

<INPUT type="hidden" name="lim_tamano" value="8000">

<p><b>Archivo a transferir<b><br>

<INPUT type="file" name="archivo"></p>

<p><INPUT type="submit" name="enviar" value="Aceptar"></p>

</FORM>

y este el guardaArchivo.php:

<?
# recogemeos en variables con el nombre de las usadas en el script anterior
# los valores transferidos por POST

$archivo_name= $_FILES['archivo']['name'];
$archivo_size= $_FILES['archivo']['size'];
$archivo_type= $_FILES['archivo']['type'];
$archivo= $_FILES['archivo']['tmp_name'];

$MAX_FILE_SIZE= $_POST['lim_tamano'];

if ($archivo != "none" AND $archivo_size != 0 AND $archivo_size<=$lim_tamano){

if (copy ($archivo, $archivo_name)) {
echo "<h2>Se ha transferido el archivo $archivo_name</h2>";
echo "<br>Su tamaño es: $archivo_size bytes<br>";
echo "<br>El fichero es tipo: $archivo_type <br>";
}else{
echo "<h2>No ha podido transferirse el fichero</h2>";
echo "<h3>Error interno del servidor.</h2>";

}
}else{
echo "<h2>No ha podido transferirse el fichero</h2>";
echo "<h3>su tamaño no puede exceder de $lim_tamano bytes</h2>";
}


?>

Me da este error:

Warning: copy(a.txt): failed to open stream: Permission denied in /web/htdocs/www.oraculorol.org/home/web/mail/guardaArchivo.php on line 14

No ha podido transferirse el fichero
Error interno del servidor.

y el php lo tengo configurado así:

file_uploads: On
upload_max_filesize: 10M
upload_tmp_dir: no value
post_max_size: 8M

pueden ayudarme chic@s?
  #2 (permalink)  
Antiguo 01/10/2003, 12:36
 
Fecha de Ingreso: abril-2003
Ubicación: Monterrey, Nuevo Leon Mex
Mensajes: 300
Antigüedad: 21 años
Puntos: 3
No lei tu codigo , pero si quieres te puedo proporcionar uno que tengo trabajando,

Saludos
  #3 (permalink)  
Antiguo 01/10/2003, 15:41
Avatar de Sir Kevin  
Fecha de Ingreso: julio-2003
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 20 años, 8 meses
Puntos: 0
Gracias, te lo agradeceria pahs.

Pero por si aca, porque me temo que es problema de la configuracion del servidor: ¿Alguien sabria contestarme?
  #4 (permalink)  
Antiguo 02/10/2003, 14:53
 
Fecha de Ingreso: abril-2003
Ubicación: Monterrey, Nuevo Leon Mex
Mensajes: 300
Antigüedad: 21 años
Puntos: 3
OK ahi te va son 2 scripts:

1ro.

****** Aqui empieza el primero *****
echo "<center>"
."<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">"
."<tr>"
." <td width=\"100%\">"
." <p align=\"center\"><b><font color=\"#AE8E20\" face=\"Garamond\" size=\"5\">Talabartería GonGon, S.A. de C.V.</font></b></FORM>"
." </p>"
." <div align=\"center\">"
." <table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" width=\"443\" bgcolor=\"#FFFF00\">"
." <tr>"
."<form enctype=\"multipart/form-data\" action=\"envio.php\" method=\"post\">"
."<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"8000000\">"
."Enviar este archivo: <input name=\"userfile\" type=\"file\">"
."<input type=\"submit\" value=\"Enviar\">"
." </tr>"
."</form>"
." </table>"
." </div>"
." <p>&nbsp;</p>"
." <p>&nbsp;</td>"
."</tr>"
."</table>"
."</center>"
."</div>"


****** Aqui empieza el 2do *****

$tam = $HTTP_POST_FILES['userfile']['size'];
//echo("$tam");
$nom=$HTTP_POST_FILES['userfile']['name'];
//echo ("$nom");
$tem=$HTTP_POST_FILES['userfile']['tmp_name'];
//echo ("$tem");
$tip=$HTTP_POST_FILES['userfile']['type'];
//echo ("$tip");
if (is_uploaded_file($tem))
{
copy($tem, "/home/gongon/public_html/exis/$nom");
chmod("$tem",0777);
echo "<div align=\"center\">"
."<center>"
."<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse\" bordercolor=\"#111111\" width=\"300\" id=\"AutoNumber1\">"
."<tr>"
." <td width=\"320\">"
." <p align=\"center\"> <b><font color=\"#7C0324\">Su envió se ha realizado con éxito</font></b></p>"
." <form method=\"POST\" action=\"index.php\">"
." <input type=\"submit\" value=\"Regresar\" name=\"B1\"></p>"
." </form>"
." <p> </td>"
."</tr>"
."</table>"
."</center>"
."</div>";
}
else
{
echo "No se ha podido Enviar ese Fichero";
}
//} else {
// echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['userfile']['name'];
//}
/* ...or... */


*** Aqui termina el 2do.

Adecualo a tus necesidades.

A mi me funciona perfectamente..
estamos en contacto a ver si te funciona.

Saludos
  #5 (permalink)  
Antiguo 02/10/2003, 15:06
Avatar de Gerald  
Fecha de Ingreso: julio-2003
Mensajes: 1.356
Antigüedad: 20 años, 9 meses
Puntos: 2
Tienes que darle permisos 777
a tu archivo

Warning: copy(a.txt): failed to open stream: Permission denied in /web/htdocs/www.oraculorol.org/home/web/mail/guardaArchivo.php on line 14

eso lo haces con el ftp :)
__________________
Solo por Hoy: Trataré de fortalecer mi mente. Estudiaré y aprenderé algo útil
Hoteldipity
Arte Caracol
  #6 (permalink)  
Antiguo 02/10/2003, 17:57
 
Fecha de Ingreso: abril-2003
Ubicación: Monterrey, Nuevo Leon Mex
Mensajes: 300
Antigüedad: 21 años
Puntos: 3
Se me olvido lo spermisos, como dice Gerald, se los tienes que dar a la carpeta del servidor
  #7 (permalink)  
Antiguo 02/10/2003, 21:18
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 11 meses
Puntos: 2
son solo ficheros.... o es una imagen tipo jpg,gif o png lo que quieres subir...?
__________________
3w.valenciadjs.com
3w.laislatv.com
  #8 (permalink)  
Antiguo 04/10/2003, 01:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
En lugar de copy() . usen preferentemente move_uploaded_files() .. les ahorrará muchos problemas en configuraciones de PHP en "safe mode" y otros detalles.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 15/10/2003, 23:15
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola a todos, tengo el mismo problema que Sir Kevin con los uploads. Estoy trabajando con archivos de imagen dejandolas en una carpeta images/ dentro de mi directorio public_html. La lectura del archivo desde el formulario funciona bien y estoy utilizando move_uploaded_files() para copiar el archivo a su destino, ademas estoy ocupando rutas relativas al script en ejecucion. El resultado es el mismo mensaje de error: "Warning: copy(a.jpg): failed to open stream: Permission denied ". Gerald menciono los permisos sobre el archivo, mas bien sobre la carpeta en la que estoy dejando los archivos, el problema es que si la dejo en 777 (o similar permitiendo que otros puedan escribir en ella) podria generar un problema de seguridad (de ser detectado). De todas formas al cambiar los permisos de la carpeta el script realizao la copia sin problemas, si cambio el permiso, el script falla, si cambio el dueño de la carpeta al usuario bajo el cual corre apache el script funciona sin problemas, si lo dejo como el usuario dueño del script, este falla. ¿Donde está el problema?. Aca va el segmento de codigo donde realizo el upload:

$upload_dir="../images/"; //directorio de imagenes en el servidor
/******* Obtener la Informacion de la imagen leida ******/
$imagen_nombre_temporal=$_FILES['pic']['tmp_name'] ; //Ruta y nombre temporal de la imagen
$imagen_contenido = addslashes(fread(fopen($imagen_nombre_temporal, "rb"), filesize($imagen_nombre_temporal))); //Contenido
$imagen_tipo=$_FILES['pic']['type']; //tipo de la imagen image/gif o image/jpeg
/******** Guardar la imagen con el nombre del codigo de producto para evitar repeticiones *******/
/******** por parte del usuario **********/
/** Para crear el nombre correcto se debe preguntar de que tipo es para concatenar la extension correcta */
if ($imagen_tipo=='image/gif')
$imagen_nombre="".$_POST['codigo'].".gif"; //nombre de la imagen
if ($imagen_tipo=='image/pjpeg')
$imagen_nombre="".$_POST['codigo'].".jpg"; //nombre de la imagen
if ($imagen_tipo=='image/jpeg')
$imagen_nombre="".$_POST['codigo'].".jpg"; //nombre de la imagen
$destino=$upload_dir;
$destino.=$imagen_nombre; //se concatena la ruta de destino y el nombre
/******** Escribir el archivo de salida *************/

if (!move_uploaded_file($imagen_nombre_temporal,$dest ino))
{
echo "failed to copy ".$imagen_nombre_temporal."...<br>\n";
exit;
}
/************************************************** ******/

Saludos a todos y gracias
  #10 (permalink)  
Antiguo 16/10/2003, 00:53
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Deja a Apache como dueño de la carpeta, y dale solo permisos totales al dueño, y de lectura y acceso al resto, quedandote los permisos estilo 7xx. Supongo que tienes PHP como modulo de Apache, por eso es apache el usuario que ejecuta el script y es ese usuario el que tiene que tener los permisos.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 16/10/2003, 01:02
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Si, eso esta bien, como dije antes, cambie el dueño de la carpeta para que fuera el mismo usuario del apache y funciono, el problema que surge es que tendria que hacer los mismo para todos los usuarios que quieran guardar sus imagenes en sus directorios locales. El problema esta resuelto para el administrador del sistema porque tiene privilegios, pero para el usuario "normal" que ejcuta sus scripts en otros directorios el problema se mantiene.

He revisado el código de varios scripts que hacen lo mismo y todos tienen lineas similares a las mias, diferenciaas como copy() por move_uploaded_file(), tambien las he probado y el script sigue retornando un "permiso denegado al tratar de copiar el archivo".

PHP esta como módulo de apache, eso esta claro.

La solucion sera autentificar al usuario que desea hacer upload??? y si alguno de mis usuarios se interesa en un script similar sin autenticacion??

Gracias de nuevo y sigue el debate
  #12 (permalink)  
Antiguo 17/10/2003, 07:00
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
La carpeta destino (donde mueves tu archivo) ha de tener permisos de escritura/lectura al menos (777 o algo ménos de permisos en tu CHMOD ..)

Pero, .. para permitirte acceder a tu directorio /tmp de ese servidor (en general desde donde PHP esté configurado para almacenar los archivos que suben por HTTP) debe igualmente tener permisos de lectura al menos para el usuario en concreto que usa Apache (o PHP) ...

También hay restricciones como el de la directiva del php.ini (en un phpinfo() de puede ver también) ...

open_basedir ...

Esa directiva .. si apunta a tu directorio asignado en ese servidor (para tu sitio www..) no podrás con PHP "salir" al /tmp por ejemplo a "buscar" ese archivo (hacerle el copy() ...).

En teoría ..la función move_uploaded_file() está diseñada para acceder al directorio /tmp (al que esté definido como upload_tmp_dir en php.ini) para mover el archivo hacia su destino definitivo una vez subido por HTTP vía los formularios comunes ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 17/10/2003, 12:09
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
De acuerdo

Ok.! muchas gracias por su ayuda, parece que todo apuntaba a los permisos de la carpeta de destino del upload. La verdad es que por un momento pense en el riesgo que puede implicar el dejar una carpeta con permisos xx7. Dadas las circunstancias en donde en mi hosting no puedo crear carpetas para las que el dueño sea apache, la unica y mejor solucion, creo, para los que se interesen es dejar la carpeta donde van a guardar las imagenes protegida dentro de otra a la cual no se pueda acceder con facilidad, ya sea con contraseña usando .htpasswd o bien autentificacion de usuarios con MySQL. Además pueden evitar que otros tengan accesso desde la web al tratar de ingresar el link en forma directa colocando un archivo index.php que los redirija a la página principal o a la página de administración.

Muchas gracias por la ayuda
Heraldex
  #14 (permalink)  
Antiguo 18/10/2003, 13:41
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola a todos, soy un nuevo usuario del sistema y tengo algunos problemas con php para subir archivos no sé si alguien tenga alguna info que me pueda echar la mano con eso porke de plano me doy de topes con eso y con lo de lass sesiones.
Por su atención gracias.
Mi e-mail es [email protected]
  #15 (permalink)  
Antiguo 18/10/2003, 13:55
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Pregunta

Podrías explicar mejor tu problema, colocando el código y explicando que es lo que te causa dificultad para poder ayudarte

Saludos
Heraldex
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:31.