RE:error al subir datos al server
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ú?
}