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