Estoy tratando realizando una página web en la que se debe permitir enviar correos con attachment, lo malo es que la cuestión del attachment no le he podido implementar pues se requiere subir los archivos al servidor por medio de php. No me funciona la parte del upload :( ¿Será qué me puedes ayudar con un ejemplo en el que se suba un archivo y se lo almacene en un lugar deseado?
1 Respuesta
Respuesta de reynierpm
1
1
reynierpm, Llevo casi 4 años programando aplicacioens web usando PHP y MySQL
Lo primero tienes que hacer es crear el formulario desde donde se va a subir el fichero. Sería algo como esto: <form name="uploadFile" id="uploadFile" method="post" enctype="multipart/form-data" action="pagina.php"> <label for="hiddFiled"><input type="hidden" name="MAX_FILE_SIZE" value="30000" /></label> <label for="upload">Fichero a subir: <input type="file" name="upFile" id="upFile" size="45" accesskey="U" value="" /> </label> <label for="btnSend"><input type="submit" name="btn_upFile" id="btn_upFile" align="center" accesskey="S" value="Subir fichero" /> </label> </form> Como puedes ver el formulario no tiene nada de complicado. El mismo es válido con HTML y XHTML. Bien ahora voy a hacer y explicar el fichero donde el formulario hará acción: "página.php". Lo primero que deben saber es que para acceder a las variables que vienen de un campo FILE se usaba antes de PHP 4.1.0 el arreglo $HTTP_POST_FILES pero a partir de la version 4.3.x y superiores se recomienda usar $_FILES. Conocido esto lo que se hace primero es acceder a todos los valores posibles de el arreglo. /* Nombre temporal que PHP otorga al fichero antes de ser subido al destino final */ $nombre_temporal = $_FILES['upFile']['tmp_name']; /* Nombre del fichero */ $nombre_fichero = $_FILES['upFile']['name']; /* Tamaño expresado en bytes del fichero */ $tamano_fichero = $_FILES['upFile']['size']; /* Tipo MIME del fichero */ $tipo_fichero = $_FILES['upFile']['type']; /* Error retornado sino se subió o ocurrieron errores mediante la carga del fichero al servidor */ $errores = $_FILES['upFile']['error']; Debo decir que la variable $errores solo toma valores numéricos del 0 al 6 (por ahora) que vienen predefinidos desde PHP 4.2.0. Los mismos son como siguen: Error 0: UPLOAD_ERR_OK: No ocurrieron errores, el fichero fue subido exitosamente Error 1: UPLOAD_ERR_INI_SIZE: El fichero subido excede los tamaños permitidos en la directiva upload_max_filesize del fichero php.ini Error 2: UPLOAD_ERR_FORM_SIZE: El fichero subido excede la directiva MAX_FILE_SIZE especificada en el formulario Error 3: UPLOAD_ERR_PARTIAL: El fichero fue subido parcialmente (no se completo la carga al servidor remoto) Error 4: UPLOAD_ERR_NO_FILE: No se subió ningún fichero Error 5: UPLOAD_ERR_NO_TMP_DIR: El directorio temporal no existe. (Adicionado en PHP 4.3.10, 5.0.3 y versiones superiores) Error 6: UPLOAD_ERR_CANT_WRITE: Fallo mientras se trataba de escribir en el disco duro. (Adicionado en PHP 5.1.0) Como verán esto nos es de gran importancia ya que en parte nos ayuda a depurar un poco el código y saber los posibles errores a la hora de subir el fichero. Bien, después de un poco de muela veamos como se lleva a cabo todo el proceso. página.php Lo primero es definir una variable en donde almacenaremos el valor del directorio de destino, o sea donde será almacenado el fichero. Código PHP: /* Para SO Windows se debe especificar la ruta completa */ $uploaddir = "D:\Servidor\WWWRoot\portal\upload_files\"; /* Para SO Linux */ $uploaddir = "/www/var/upload_files/"; /* En mi caso que tengo Apache 2.0.55 configurado correctamente sobre Windows no me es necesario poner la ruta completa */ $uploaddir = "/portal/upload_files/"; -------- Nota: Nótese el uso de los slash normales e invertidos, esto es muy importante tenerlo en cuenta. Nota 2: Cuando dije que tenia mi servidor web bien configurado simplemente es que tengo configurado mi Apache para que me sirva las páginas como Hosts Virtuales, o sea, en vez de llamar mi sitio como http://localhost/portal/pagina.php lo llamo así http://portal.vanhelsing.net/pagina.php . Esto me da la facilidad de que si luego el Portal sera subido a un hosting como por ejemplo el Portal de SIMPRO aquí en la UCI, no tener que cambiar las rutas ni nada por el estilo. -------- Ahora para continuar lo que debemos hacer es comprobar si se subió un fichero o no. Código PHP: if (!isset($nombre_fichero) && !empty($nombre_fichero)) { // realizamos la subida del fichero } else { echo "Debes especificar un fichero para subir"; exit(); } Para subir el fichero se usa la función move_uploaded_file que se le pasan dos parámetros obligatorios. El primero es el nombre temporal que da PHP al fichero y el segundo es el destino del fichero. Luego el proceso de subida del fichero es el siguiente: Código PHP: $upload_file = move_uploaded_file($nombre_temporal, $uploaddir . $nombre_fichero); if ($upload) { echo "Fichero subido exitosamente"; // Continuo lo que debo hacer } else { echo "Ocurrieron errores" . $errores; exit(); } Esa es la forma que uso para subir aunque a veces la modifico de acuerdo a las necesidades del sistema. Lo otro que te puedo decir es que uses la clase phpmailer que esta muy buena y permite adjuntar ficheros. Saludos y espero haber sido de ayuda