PHP - error al subir datos al server

   
Vista:

error al subir datos al server

Publicado por miguel (112 intervenciones) el 13/08/2008 04:56:02
Amigos PHP, he creado un fichero con extencion .csv y en mi pc en el servidor local sube los datos a la base de datos MySql sin problemas, pero al servidor real no.
Me muestra el error:
fopen(C:\mak\Data\updatabase.csv) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/xxxxxl/public_html/updata/updata.php on line 6
La linea 6 contiene $fp = fopen ($file,"r"); donde $file contiene el nombre del archivo pasado por $_POST.
Como les digo, en local lo hace sin problemas, pero en servidor real no lo hace.
Al ver la tabla en la base del servidor, esta vacia excepto que se ha incrementado el autonumerico.
Cual es problema ??? Me falta configurar algo en el server real ??
Gracias a quin pueda ayudarme.

MP
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:error al subir datos al server

Publicado por Diego Romero (1450 intervenciones) el 13/08/2008 07:47:05
¿Qué vale $file antes de ser pasada a fopen?. De lo que se queja PHP es que no encuentra el archivo apuntado por $file.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 13/08/2008 15:14:16
Ya revise $file y contiene la ruta y el nombre del archivo que quiero subir. Eso esta bien.
Lo extraño es que como te decia, en modo local en mi pc con el easyPHP y la DB Mysql lo hace bien, pasa sin problemas todas las pruebas, el problema aparece al momento de ejecutar esto en el servidor de produccion, el real.
Gracias Diego por contestar.

MP
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 13/08/2008 16:23:10
Mas datos, en el error.log de la carpeta del servidor donde esta la pagina que provoca el error aparece esto:

PHP Warning: fgetcsv() expects parameter 1 to be resource, boolean given in /home/comercl/public_html/updata/updata.php on line 7

MP
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por Diego Romero (1450 intervenciones) el 13/08/2008 18:56:02
Miguel, lo que quería que nos dijeras es qué contiene $file, ya sé que es una ruta pero ¿cuál ruta?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 13/08/2008 21:43:32
Buena pregunta: ¿ que ruta ? Es la de la ubicacion del archivo en el PC local.

MP
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por Diego Romero (1450 intervenciones) el 14/08/2008 04:03:05
Me parecía...

Pues hombre, el script que tú estás ejecutando se está ejecutando en un servidor remoto y esa ruta hace referencia a un archivo que existe en la PC del cliente ¿cómo demonios va a acceder el servidor a ese archivo? :D.

Mejor vamos desde el principio: ¿qué quieres lograr?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 14/08/2008 16:21:49
Gracias Diego por tu atencion.
Lo que quiero lograr es que el usuario elija desde su disco duro un archivo ya preparado excel (separado por punto y coma) y por medio de codigo lo guarde en una tabla de de MySql.
Te adjunto el codigo que tengo y que funciona perfecto en mi pc en local, sube los datos a la tabla, pero no asi en el servidor real. Es un form simple que envia por POST...

<?php
if (isset($_POST["upload"])) {
$file=$_POST["txtFile"];
$row = 1;
echo $file;
$fp = fopen ($file,"r");
while (($data = fgetcsv ($fp, 1000, ";")) !== FALSE){
$num = count ($data);
$row++;
INCLUDE("../connect.php");
$inserta="insert into cargas(idClie,name,dirclie,email,contact) values ('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]')";
mysql_query($inserta);
}
fclose ($fp);
$mensaje='TODO OK';
echo "<script>window.location.href='mensa.php?mens=$mensaje'</script>";
}
?>
<html>
<head>
<title>Upload DataBase Cargas</title>
<link rel="stylesheet" type="text/css" href="/estilos.css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<table width="98%" height="85" border="0" class="estilotabla">
<tr>
<td width="11%" height="38" bgcolor="#666666"> </td>
<td width="89%"><font color="#3399CC" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Select
file</strong></font></td>
</tr>
<tr>
<td> </td>
<td><form name="form1" method="post" action="updata.php">
<input type="file" name="txtFile" size="30">
<input type="submit" name="upload" value="Submit">
</form></td>
</tr>
</table>
</div>
</body>
</html>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por Diego Romero (1450 intervenciones) el 14/08/2008 19:38:34
Comprendo pero lo que estás haciendo es totalmente incorrecto. Y no lo digo con desprecio si no con ánimo de enseñar, si me permites claro. Como no te conozco me atajo primero. Nadie nace sabiendo, ni siquiera yo, y el razonamiento que has empleado alguna vez me tocó a mi también y cometí los mismos errores (en otro caso, pero no viene a cuento).

Lo que te sucede es que estás confundido en la forma en que trabaja el modelo cliente-servidor. Debes tener siempre presente que si estás programando en PHP estás haciendo que el servidor haga algo para el cliente, y si estás escribiendo código HTML o JavaScript estás haciendo que el cliente haga algo para el usuario. Aunque el servidor web esté ejecutándose en la misma máquina que el cliente eso es irrelevante, el servidor hace cosas por su cuenta y el cliente por las suyas.

En tu PC las cosas tal como las has hecho funcionan porque da la casualidad que cliente y servidor acceden al mismo disco con el mismo sistema de archivos, pero eso no es así cuando servidor y cliente reciden en máquinas distintas. Y esto es absolútamente cierto, a juzgar por el mensaje de error que has mostrado, donde el cliente está ejecutándose en un Windows y el servidor en un Unix, ambos tienen sistemas de archivos incompatibles. Y donde el servidor no tiene cómo, ni puede acceder al sistema de archivos del cliente directamente, es el cliente el que puede hacer eso, el servidor no.

Por lo tanto es el cliente el que tiene que decirle al servidor que se prepare para recibir un stream de byte que debe almacenar como un archivo en disco del servidor.

Para hacer esto el protocolo HTTP tiene ciertas previsiones. Y para lograrlo tienes que instruir al cliente a que haga eso mismo.

Basta de teoría, vamos a los hechos.

Esto código HTML parece funcionar:

<form name="form1" method="post" action="updata.php">
<input type="file" name="txtFile" size="30">
<input type="submit" name="upload" value="Submit">
</form>

Pero te faltan dos cosas importantes para que el servidor entienda que lo que el cliente pretende es enviarle un stream de bytes y no una ruta con un nombre de archivo. Es la cláusula enctype="multipart/form-data". El formulario debería ser así:

<form name="form1" method="post" action="updata.php" enctype="multipart/form-data">
<input type="file" name="txtFile" size="30">
<input type="submit" name="upload" value="Submit">
</form>

Así en vez de enviar el nombre de un archivo (y su ruta) lo que el cliente enviará será el stream de bytes que compone el archivo más el nombre físico de ese archivo tal como está en el cliente *pero no su ruta* porque la ruta al archivo es irrelevante para el servidor.

Además de esto el cliente le debe indicar al servidor cuántos bytes máximos tiene que aceptar, para ello necesitas poner un campo hidden con nombre MAX_FILE_SIZE, así:

<form name="form1" method="post" action="updata.php" enctype="multipart/form-data">
<input type="file" name="txtFile" size="30">
<input type="submit" name="upload" value="Submit">
<input type="hidden" name="MAX_FILE_SIZE" value="8388608">
</form>

Esto es todo lo que tiene que ver con el cliente. Ahora cuando el usuario a seleccionado un archivo de su disco e hizo clic en "Submit" el servidor entiende que debe aceptar un stream de bytes y almacenarlo en su propio disco. Pero no es PHP quien se encarga de eso, sino el software servidor web. Pero no pone ese stream de bytes en cualquier parte, lo pone como un archivo en un directorio especial (generalmente es el "tmp" en Unix o "temp" en Windows). Y luego le dice mediante un array superglobal llamado $_FILES a tu script PHP dónde está ese archivo el cual tiene un nombre temporal aleatorio generado por el servidor.

Es allí donde el script PHP tiene que ir a buscar el archivo que ha enviado el cliente. Para esto PHP cuenta con unas funciones que facilitan la tarea.

Comencemos con los datos $_FILES que ha enviado el cliente. En tu caso el campo "txtFile" se convierte en un array dentro de $_FILES que contiene datos sobre el archivo, estos son, usando tu ejemplo:

$_FILES["txtFile"]["name"] El nombre del archivo tal como está en el cliente (es decir, el nombre del archivo que el usuario ha enviado).
$_FILES["txtFile"]["type"] Contiene el tipo MIME del archivo, si es una imagen JPG, por ejemplo, esto contiene la cadena "image/jpeg".
$_FILES["txtFile"]["tmp_name"] Aquí está la ruta más el nombre del archivo temporario en el servidor. Es aquí donde tienes el dato que te permitirá trabajar con el archivo cuando ya está en el servidor.
$_FILES["txtFile"]["error"] Contiene el código de error que ocurrió durante la transferencia del archivo, si es cero es que no hubo error.
$_FILES["txtFile"]["size"] El tamaño en bytes del archivo transferido.

Debido a que el archivo cuando está en el servidor está en un directorio fuera del home del sitio web y además está en un directorio reservado para archivos temporales, no se asegura que ese archivo permanecerá para siempre allí, por lo tanto el script PHP debe mover ese archivo a un lugar donde se le pueda almacenar permanentemente y, como tiene un nombre aleatorio, renombrarlo adecuadamente.

Para hacer esto último PHP tiene una función que determina si un archivo en el servidor es un archivo recibido desde el cliente y otra función que mueve ese archivo al lugar que tú elijas. Se hace así:

if (is_uploaded_file($_FILES["txtFile"]["tmp_name"])) {
move_uploaded_file($_FILES["txtFile"]["tmp_name"], "subidos/".$_FILES["txtFile"][name"]) }

Nota que en el segundo parámetro de move_uploaded_file() le pongo un directorio dentro del home del sitio web, ese directorio debe existir, por supuesto, y de paso lo renombra con el nombre que el archivo tenía en el disco del cliente.

Aunque, y esto es una opinión personal, prefiero usar la función copy() de PHP para copiar el archivo y luego borrar el temporario con unlink().

¿Necesitas que te reescriba el código que has posteado con todo lo que he explicado o puedes hacerlo tú?
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 14/08/2008 21:53:56
OK Diego, muy agradecido por tu gran aporte, de verdad que deberia haber mas gente como tu, con esa disposicion a ayudar.
Intentare hacer lo que me indicaste ya que me aclaras varios puntos. (sobretodo es que son distintas plataformas) y si aun te queda un tiempo me reescribes el codigo tal como ofreciste al final de este, que es mucho mas que una clase magistral de PHP.
GRANDE Diego y gracias otra vez, por aclarar y enseñarme.
Despues de esto soy un poco mas grande, y seguro que tu tambien.
Saludos

Miguel Perez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error al subir datos al server

Publicado por miguel (112 intervenciones) el 14/08/2008 23:11:37
!!! Lo hice ¡¡¡¡ Gracias a las aclaraciones/enseñanzas de Diego.
Aqui va el codigo, eso si falta varias validaciones como el tipo y tamaño del archiv a subir, capturar los errores, etc. Asi como esta sube un archivo .csv a la base de datos MySql.

<?php
if (isset($_POST["upload"])) {
$file=$_FILES["txtFile"]["tmp_name"];
$row = 1;
echo $file;
$fp = fopen ($file,"r");
while (($data = fgetcsv ($fp, 1000, ";")) !== FALSE){
$num = count ($data);
$row++;
INCLUDE("../connect.php");
.......
// el form quedo asi

<td><form name="form1" method="post" action="" enctype="MULTIPART/FORM-DATA">
<input type="file" name="txtFile" size="30">
<input type="hidden" mame="MAX_FILE_SIZE" value="10000">
<input type="submit" name="upload" value="Submit">
</form></td>
</tr>

Gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar