Justi 28 de julio de 2008 a las 12.15
   Imprimir artículo
elWebmaster.com

Taller de PHP: Moviendo archivos


Taller de PHP: Moviendo archivosHola, bienvenidos al Taller de PHP. En la clase de hoy vamos a ver cómo subir archivos al servidor y algunos casos de uso. En realidad suena complicado pero es más sencillo de lo que parece. Hay varias cosas a tener en cuenta para ello, por ejemplo, si vamos a utilizar un formulario para subir los archivos.

Además hay que tener en claro el proceso que se llevará a cabo en el back-end, donde usaremos la función $_FILES, que nos permite trabajar mucho más específicamente con los archivos, agregar restricciones, etc. ¡Comencemos!

¿Cómo tiene que ser nuestro formulario?

A la hora de querer subir un archivo al servidor desde un formulario para poder agregar imágenes en una noticia, por ejemplo, tenemos que tener en cuenta algunos detallecitos.

El más importante de todos y el que casi todo el mundo se olvida es avisarle al formulario que se van a enviar archivos, para ello agregamos el siguiente parámetro en el tag de apertura del formulario: enctype=”multipart/form-data”.

Y luego sí, agregamos el input de tipo file para que se pueda enviar un archivo. El formulario básicamente quedaría así:

<form name="nueva-noticia" enctype="multipart/form-data" method="post" action="nueva_noticia.php">
<label>Título <br /><input type="text" name="titulo" value="" /></label>
<label>Cuerpo <br /><textarea cols="80" rows="10" name="cuerpo"></textarea></label>
<label>Imagen <br /><input type="file" name="imagen" value="" /></label>
</form>

El Back-End

En nuestro back-end, o sea, en nuestro proceso por php para recibir el formulario, lo vamos a hacer exactamente igual que como lo veníamos haciendo con el resto de los formularios, vamos a recibir vía POST las variables titulo y cuerpo, pero no imagen.

Sí, ya sé que nuestro input se llama imagen, pero en este caso en lugar de recibirla como $_POST[‘imagen’], la vamos a recibir como $_FILES[‘imagen’]. “¿Qué diferencia hay con POST?” se preguntarán y la respuesta es bastante sencilla, FILES nos da bastante más información respecto al archivo que subimos:

  • $_FILES[‘imagen’][‘tmp_name’] – nos da la ruta y el nombre temporal al archivo que acabamos de subir, si no queremos perder este archivo, lo que tenemos que hacer es moverlo a una carpeta nuestra dentro del hosting, por lo general no se tiene acceso a la carpeta temporal donde se suben los archivos.
  • $_FILES[‘imagen’][‘size’] – nos dice el tamaño que tiene el archivo, por si se realiza un servicio público y queremos limitar la subida solo a archivos de 1 mega, entonces se puede poner una condición utilizando este valor.
  • $_FILES[‘imagen’][‘type’] – nos va a indicar el tipo de archivo del que se trate, en nuestro ejemplo, como sólo queremos que se suban imágenes podemos poner un if limitando sólo al caso de las imágenes.
  • $_FILES[‘imagen’][‘name’] – nos va a indicar el nombre del archivo original, ya que el tmp_name es un nombre generado por el servidor.

Entonces ya sabiendo cómo leer el archivo que acabamos de enviar desde el formulario, solo nos resta moverlo a la carpeta de destino.

Supongamos que nosotros en el servidor tenemos la carpeta uploads donde vamos a guardar todas las imágenes de las noticias, lo que tenemos que hacer es poner la url absoluta a esa carpeta.

Fíjense que no es desde donde están todos nuestros scripts de php, sino que va a ser algo del estilo /var/www/elwebmaster.com/htdocs/uploads, y si están en Windows probablemente sea algo así: c:/archivos de programa/xampp/www/elwebmaster.com/uploads. Si ustedes tienen un servicio de hosting contratado, lo más probable que les hayan enviado un email con la información a su carpeta absoluta en el servidor, ya que ustedes si ingresan por ftp, van a entrar directamente a la carpeta a donde incluyen sus scripts, pero en realidad esta tiene un raíz en otro lado.

Si no tienen el email, y no tienen ni idea como es la url absoluta en donde están parados, pueden generar un error de php a propósito, y el mismo error les va a decir dónde se encuentran, por ejemplo, si en sus script ponen:

<? sadfasdf ?>

Les va a aparecer el siguiente error:

Parse error: syntax error, unexpected T_STRING in /var/www/elwebmaster.com/www/index.php on line 5

Eso quiere decir que nuestra url absoluta es /var/www/elwebmaster.com/www/

Bueno, ya tenemos nuestro archivo, ya conocemos nuestra url absoluta y ya tenemos nuestra carpeta donde queremos mover, lo que vamos a hacer es usar la función de php move_uploaded_file(), que va a mover un archivo recién subido a una nueva ubicación:

<?
$destino = '/var/www/elwebmaster.com/www/uploads';
$origen = $_FILES['imagen']['tmp_name'];
move_uploaded_file( $origen, $destino );
?>

¿Sencillito, no? La semana que viene vamos a ver como recibir imágenes grandotas y convertirlas en imágenes más pequeñas para que se adapten a nuestro sitio.

¡Saludos!

<< CLASE ANTERIOR  

CLASE SIGUIENTE >>


Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (19)

  1. nicolas dice:

    hola se que esta pregunta no es referida al tema, pero quisiera que la consideres para una proxima clase de “respuestas a las preguntas”, mi duda es como hacer lo que en esta pagina se puede presenciar a la derecha, donde uno cuando clickea en “Curso php”, la columna se agranda hacia abajo y aparecen los cursos, tengo una idea gral que puede ser con CAPAS, pero no se me ocurre como, si quieres puedes fijarte en un sitio que hice — http://organizacionmichetti.com/presupu.php — que he trabajado con capas, pero no logro mover las demas hacia abajo, si pudieras ayudarme o explicar te lo agradeceria mucho. Por cierto, muy buen trabajo el tuyo, cabe destacar que gracias a vos, pude aprender y a hacer muchas cosas, nuevamente te doy un GRACIAS!

  2. harry dice:

    Buenas muy bueno esto de las clases jeje… podrias poner algo mas de información referente a las sesiones y a los cookies? por ejemplo explicar como mantener un valor para usarlo mas tarde en una sesion.

    un saludo

  3. César Cancino dice:

    Hola Nicolás, ese mené de la Página que muestras está programado con otro tipo de tecnología, específicamente con JavaScript, se utiliza un script basado en una función que te permite mostrar u ocultar tablas…

  4. Luis dice:

    hola a todos-…
    tengo un problema al momento de mover el archivo al servidor me sale el siguiente error… me podrian ayudar…… gracias
    El error es:
    Warning: move_uploaded_file(c:/xampp/htdocs/xampp/Curso_php/uploads) [function.move-uploaded-file]: failed to open stream: Permission denied in C:\xampp\htdocs\xampp\Curso_php\new-uploads.php on line 4

    Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘C:\xampp\tmp\php69.tmp’ to ‘c:/xampp/htdocs/xampp/Curso_php/uploads’ in C:\xampp\htdocs\xampp\Curso_php\new-uploads.php on line 4

    no se que hacer ……
    gracias

  5. HurryCrack dice:

    Con respecto a los warnings que esta teniendo el amigo Luis quiero comentarle
    que seguramente sean por los permisos que tiene en esta carpeta y en estos archivos.
    Pon los como lectura escritura y listo. Chau.

  6. Justi dice:

    tal cual lo que dijo HurryCrack, es muy probable que sea por los permisos sobre el archivo o la carpeta, lo unico extraño que por las URL que tira es windows donde esta corriendo xampp y ahi no deberia tener problemas de permiso.

    Igual el error es claro de que no esta teniendo permisos jeje “Permission denied”

  7. Edison dice:

    Justi tengo el mismo problema de Luis yo uso el xampp en windows xp y la carpeta c:/xampp/htdocs/xampp/proyejemplos/imagenes y alli ya le e cambiado los permisos a la carpeta en windows pero nada ,sigue saliendo ese error, no habra alguna manera de configurar en el archivo de configuracion del Apache poner digamos ”chmod 777 c:/xampp/htdocs/” para que tenga los permisos, si puedes poner la solucion de una manera mas detallada (la ruta y el codigo)para poder hacerlo y ya no salga ese error.

    De ante mano mucgas gracias.

  8. kyo_ram dice:

    yo tengo un problema con php, lo estoy corriendo en un servidor windows server 2008.
    el problema es que no tengo acceso a el dierectorio temporal. windows no le deja a php hacerlo.
    me regresa un error de permiso denegado.

    existe algun parametro para evitar subir el archivo al directorio temporal y subirlo directamente al directorio destino? Muchas gracias.

  9. edgar dice:

    Disculpa he intentado subir unas imagenes a mi hots(que es gratuito 260mb.com) pero no me transporta la imagen a mi host pero tampoco me sale una error y no se bien cual es mi url absoluta, la funcion que pusiste no me sale(hacer el error), y no se como hacerle, en que estaré mal?

  10. abraham dice:

    No me sube los archivos, el proveedor ya me dio la url absoluta me comento que solo la dirigiera a public_html/index_archivos en destino pero voy a esa carpeta y no hay nada del archivo que puede ser?

    MI FORMA

    y asi lo recibo en PHP

    les dejo mi mail branimlm@hotmail.com, porque nose si me avise cuando me contesten

    no me dejo subir el codi porque?

    $destino = ‘public_html/index_archivos’;
    $origen = $_FILES[‘nom_del_archivo’][‘name’];
    move_uploaded_file( $origen, $destino );

    a ver hay va el form
    method=”POST” ENCTYPE=”multipart/form-data” action=”nueva_noticia.php”>

  11. Justi dice:

    @abraham hola, asegurate que la carpeta index_archivos tenga permisos de escritura, chmod 777

  12. jorge dice:

    Hola … muchas gracias por los aportes, sin embargo me ha salido el mismo error que a luis
    “Warning: move_uploaded_file(C:/ms4w/Apache/htdocs/cccp/tmp) [function.move-uploaded-file]: failed to open stream: Permission denied in C:\ms4w\Apache\htdocs\cccp\formEdit.php on line 49

    Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘C:\ms4w\tmp\phpA5B6.tmp’ to ‘C:/ms4w/Apache/htdocs/cccp/tmp’ in C:\ms4w\Apache\htdocs\cccp\formEdit.php on line 49”
    jejeeje lo peor de todo es que entre las respuestas no aparece nada definitivo para solucionar, así que aquí les dejo mi aporte en mi blog por si les sirve…
    antes mi configuración: tengo windows 7, apache, php y mysql y he aquí lo que encontré…
    http://phonck.blogspot.com/2010/04/subir-archibos-al-servidor.html

  13. BSD dice:

    Si ha alguien le sale este error:

    Warning: move_uploaded_file() [function.move-uploaded-file]: The second argument to copy() function cannot be a directory in …..

    Debe poner el nombre del archivo al directorio, quedando asi:

    $nombre = $_FILES[‘imagen’][‘name’];
    $destino = ‘C:\Uploads/’ .$nombre;

  14. Guada dice:

    1. ¿La “función $_FILES” es en realidad un array o matriz, verdad?
    2. Para qué tenemos que tener en cuenta si se van a subir las imágenes mediante formulario, en primer lugar, si no conocemos otra opción?
    3. “detallecitos”? jaja! … ¡detallitos!
    4. Pa’ qué es el atributo “value” de la etiqueta ? ¿Para qué puede servir?
    5. “lo que tenemos que hacer es moverlo a una carpeta nuestra dentro del hosting, por lo general no se tiene acceso a la carpeta temporal donde se suben los archivos.” ?? ¡Vaya confusión!
    ¿Cómo vamos a mover, si no podemos acceder?
    ¿Si normalmente no tenemos acceso a la carpeta temporal, por qué intentamos mover y no copiar?
    6. “$_FILES[‘imagen’][‘type’] – nos va a indicar el tipo de archivo del que se trate”
    ¿En base a qué criterio?

    Si!, … sencillito, sencillito, pero pachín, pachán….

  15. Guada dice:

    Uy! Más de lo mismo…
    En este ejercicio todo sale ok, hasta recibo el nombre del archivo temporal:
    /tmp/phpQFHmDS, por ej., pero no se graba el archivo enviado. No existe.
    No hallo la manera de que el trabajo con archivos sea efectivo. Quizás sea alguna de tantos parámetros de config. del Apachito? Pero cuál?

  16. Guada dice:

    Me gustaría saber cómo se puede utilizar un formulario que recoja: nombre de ususario (login), password y un archivo, para enviar dicho archivo a un servidor (preferiblemente con Linux) que lo guardará (por ej. y para simplificar, en el directorio de dicho usuario) pero sólo si el usuario tiene cuenta.
    A ver si alguien sabe.

  17. Weyne dice:

    a mi me funciona muy bien el ejemplo aqui dejó mi codigo fuente:

    echo “Nombre Temporal: ” . $_FILES[‘imagen’][‘tmp_name’] .””;
    echo “Nombre del Archivo: ” . $_FILES[‘imagen’][‘name’] .””;
    echo “Tipo de Archivo: ” .$_FILES[‘imagen’][‘type’] .””;
    echo “Tamaño: ” . number_format(($_FILES[‘imagen’][‘size’]/1024),2) .” KB”;

    $destino = ‘C:\xampp\htdocs\www\uploads\imagen.jpg’;
    $origen = $_FILES[‘imagen’][‘tmp_name’];
    move_uploaded_file($origen,$destino);

  18. joel dice:

    no se si ayude pero algo debe de servir:

    if ($_POST)
    {

    $nombre = $_POST[“txtNombre”];
    $comentario = $_POST[“txtComentario”];
    $cod = guardarComentarios ($nombre, $comentario);

    if ($_FILES [“txtFoto”][“error”] != 4)
    {
    move_uploaded_file($_FILES[“txtFoto”][“tmp_name”],”files/$cod”);
    }
    else
    {
    copy(“images/cara.jpg”, “files/$cod”);
    }
    }

  19. joel dice:

    esta es la funcion: haa en el comentario de arriba donde dice (images) & (files), son carpetes pueden llamarle como quieran.

    function guardarComentarios ($nombre, $comentario)
    {
    $fecha = date (“d/m/y”,time());
    $sql = “insert into opiniones
    (nombre,comentario,fecha) values(‘$nombre’,’$comentario’,’$fecha’)”;
    mysql_query($sql);
    return mysql_insert_id();

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder