Ulzurrun de Asanza i Sàez

Subir un archivo a tu servidor con PHP

Nunca biene mal saber algo más, aunque no lo vayas a usar.

Yo no pensaba que usaría un formulario para subir archivos al servidor, pero hace unos días he necesitado crear un formulario de este tipo, así que me he puesto a investigar un poco y a crear un script para subir archivos al servidor.

El objetivo del tutorial está claro: Subir un archivo al servidor con un formulario.

Para poder realizarlo necesitamos darle permisos 777 a la carpeta en la que subiremos las imágenes.

El formulario

Primero creamos un formulario con un input de tipo file. Además tenemos que darle al atributo enctype del formulario el valor multipart/form-data.

El campo de para subir el archivo lo llamaremos archivo.

El final tendremos un código así:


<form method="post" enctype="multipart/form-data">
<input type="file" name="archivo">
<input type="submit" value="Enviar">
</form>

El PHP

Ahora pasamos al PHP. Usaremos $_FILE para detectar el nombre temporal de archivo y el nombre del mismo.

Si usamos la función print_r para mostrar la matriz $_FILE, veremos que ésta tiene almacenados, entre otros datos, el archivo temporal, el tamaño y el formato del archivo.

Nosotros nos fijaremos sólo en el nombre.

Antes de seguir tenemos que comprobar que el archivo ha sido subido con el formulario, así que lo comprobamos usando la función is_uploaded_file().

Después usando la función copy() copiaremos el archivo a la carpeta que queramos.

El código quedará así:

if (is_uploaded_file($_FILES['archivo']['tmp_name'])) {
copy($_FILES['archivo']['tmp_name'], 'C:/Servidor/'.$_FILES['archivo']['name'].'');
}

Nota: Si os fijáis en la función copy, he escrto C:/Servidor/ . Esta es la carpeta en la que quiero poner los archivos subidos. Tened en cuenta que estoy trabajando en un servidor casero en Windows, y que si vosotros tenéis un servidor Linux no debéis poner C:/.

Con esto ya copiaría el archivo a la carpeta que queremos.

Últimos retoques

Por último podemos añadir una cosa más: Un aviso de si se ha subido correctamente o no. Para eso creamos una variable juesto después de la función copy (dentro de la condición), que tenga por valor true.

Luego creamos una nueva condición: Si la variable es true, se ha subido bien el archivo, si no, avisamos del error.

El código final quedaría así:

if (is_uploaded_file($_FILES['archivo']['tmp_name'])) {
copy($_FILES['archivo']['tmp_name'], 'C:/Servidor/'.$_FILES['archivo']['name'].'');
$subido = true;
}
if($subido) {
echo "<p>El archivo ha sido subido con exito</p>";
} else {
echo "<p><strong>Error:</strong> El archivo no ha sido subido</p>";
}

Y listo, con esto ya hemos acabado nuestro formulario para subir archivos.


21 replies on “Subir un archivo a tu servidor con PHP

  1. hola……. ya cuento con ese codigo que es el que sube el archivo a una carpeta de mi servidor…. pero el problema es que necesito que en un php, me registre 5 campos y aparte el campo del archivo(examinar) en mi BD ya que despues de ser registrados se necesitan realizar busquedas…. este es el formulario que utilizo…<form name="form1" method="post" action="">  <table width="200" border="0">    <tr>      <td>Disposicion </td>      <td><input name="a" type="text" id="a3" value="" size="50"></td>    </tr>    <tr>      <td>Sintesis</td>      <td><textarea name="b" cols="50" id="textarea2"></textarea></td>    </tr>    <tr>      <td>fecha</td>      <td><input name="c" type="text" id="c3"></td>    </tr>    <tr>      <td><span class="text">Archivo PDF. </span></td>      <td><span class="text">        <input name="archivo" type="file" class="casilla" id="archivo3" size="35" />      </span></td>    </tr>  </table>  <span class="text">    <input name="enviar" type="submit" class="boton" id="enviar2" value="Upload File" />  </span></form>
    esos son algunos de los datos que necesito que se almacenen en la BD al mismo tiempo que se sube el archivo a la carpeta del servidor… ya que al momento de realizar la consulta solo obtengo el nombre del archivo…
    Espero me puedan ayudar …URGEEE!!!!!!!

  2. Es formulario del tutorial sólo copia el archivo al servidor, no almacena nada en la base de datos.
    Si lo que quieres es meter contenidos en la base de datos necesitarás hacer una consulta e insertar los datos, pero eso es por otro lado, el tutorial se centra en la subida del archivo.

  3. si quieres hacer busquedas con los archivos y campos que estamos metiendo al servidor ciertamente no podras meterlos a la BD con ese metodo.
    <code>if (is_uploaded_file($_FILES['archivo']['tmp_name'])) { copy($_FILES['archivo']['tmp_name'], ‘C:/Servidor/’.$_FILES['archivo']['name'].”); }</code>
    en esta parte el nombre del archivo es $_FILES['nombre'] ['name'] eso quiere decir que si quieres meter algo en la base de datos seria el nombre del archivo y sus campos como una descripcion o datos adicionales, entonces tendremos el nombre del archivo el cual nos puede servir para descargarlo o buscarlo puesto que estan en una sola carpeta. para intruducir los datos a la BD seria:
    <form method="post" enctype="multipart/form-data">         <input type="file" name="archivo">        Descripcion:        <input type="text" value="" name="des">         <input type="submit" value="Enviar">         </form>         <?php         if (is_uploaded_file($_FILES['archivo']['tmp_name']))         {        copy($_FILES['archivo']['tmp_name'],'c:/archivos/'.$_FILES['archivo']['name']);        $subido = true;        $link=Conectarse(); // aqui tendras que hacer la funcion de coneccion a la BD de Mysql        $h = $_FILES['archivo']['name'];        $k=$_POST['des'];        mysql_query("insert into tu_tabla value('$h','$k')",$link);        mysql_close($link);
    y los que faltan son las busquedas….. espero haberte ayudado….

  4. Hola!!
    Oye disculpa sabes que no puedo hacer que funcione para que se guarde el nombre en la base de datos me podrian ayudar…

  5. Thelma, ¿qué error tienes exáctamente? Pega el código que utilizas, sino no podemos ayudarte.

  6. Estoy al borde de la desesperación, sé que soy neófito en php pero no pudo creer que no pueda crear esta aplicacion para subir archivos a un servidor linux.. Si alguien puede quitarme lo estúpido de lo agradeceré.
    Codigo en archivo php
     
    <?$status = "";if ($_POST["action"] == "upload") {    // obtenemos los datos del archivo     $tamano = $_FILES["archivo"]['size'];    $tipo = $_FILES["archivo"]['type'];    $archivo = $_FILES["archivo"]['name'];    $prefijo = substr(md5(uniqid(rand())),0,6);        if ($archivo != "") {        // guardamos el archivo a la carpeta files        $destino =  "files/".$prefijo."_".$archivo;        if (copy($_FILES['archivo']['tmp_name'],$destino)) {            $status = "Archivo subido: <b>".$archivo."";        } else {            $status = "Error al subir el archivo";        }    } else {        $status = "Error al subir archivo";    }} ?>
     
    Ademas no sé por qué encuentro tantos ejemplos con conexión al servidor y otros como el que puse sin ninguna conexión…
     
    Gracias

  7. Hola!! quiero subir un archivo al servidor y ya tengo el codigo php y para el formulario tambien, es solo que necesito saber donde se ubica la carpeta a la que debo darle todos los accesos "777" ???
    espero su respuesta..Gracias!

  8. @julio: Disculpa el retraso. No me he dado cuenta de que había un nuevo comentario hasta que ha comentado Yolanda. ¿Qué error tienes exactamante? ¿No se copia el archivo? Te recomiendo que compruebes los permisos de la carpeta, es posible que ése sea el problema.
    @Yolanda: En mi servidor de pruebas es "C:/Servidor/", pero depende del servidor que tú uses y de la carpeta que más te convenga. Por ejemplo, imagina la siguiente estructura de carpetas y archivos:

    Administración

    Index.php
    Editar.php
    SubirImagen.php
    . . . .

    ContenidoSubido
    Index.php
    . . . .

    Si usamos el archivo SubirImagen.php para subir las imágenes al servidor, y queremos almacenarlas en ContenidoSubido, el código quedaría así:
    <code>
    if (is_uploaded_file($_FILES['archivo']['tmp_name'])) {     copy($_FILES['archivo']['tmp_name'], '../ContenidoSubido/'.$_FILES['archivo']['name'].'');     $subido = true;} if($subido) {      echo "El archivo ha sido subido con exito"; } else {        echo "Error: El archivo no ha sido subido"; }</code>
    En este caso la carpeta ContenidoSubido debería tener permisos 777.
     

  9. hola a todos alguien save si es posoible usar la varible $_FILES al enviar los datos via ajax espero sus respuestas desde ya gracias mi correo es sdarknot@gmail.com :-)

  10. Hola a todos::::Ya he checado varios codigos estos funcionan bien para realizar pruebas con servidor alojado en windows pero para un servidor dedicado como ubuntu serverver no funciona marca un error

  11. @Fernando: No lo he comprobado en ninguna distribución de Linux ni en Mac, así que no sé si funcionará bien en estas plataformas. Lo cierto es que escribí el tutorial probando en un servidor Windows…

  12. ei gracias viejo!!! si funciona de toke (Y), lo unico que no logro hacer es tratar de cambiarle el nombre a la imagen cuando sube al servidor un ejemplo…
    el usuario sube la imagen con el nombre abcd.jpg, pero en el servidor la kiero guardar con otro nombre como imagen.jpg, trato de utilizar la funciòn rename (string $oldname, string $newname) pero no me funcion

  13. ya lo logre realizar… el codigo me kedo de la siguiente forma:
    $MAXIMUM_FILESIZE = 1024 * 200; // 200KB
    // capturo el nombre que deseo darle a la imagen por medio de un TextInput.
    $nombreImagen = $_POST['nombreImagen'];
    // compruebo que la imagen no pese mas de 200KB
    if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) {
    if (is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "…/images/".$_FILES['Filedata']['name']);
    rename("…/images/".$_FILES['Filedata']['name'], "…/images/".$nombreImagen.".jpg");
    }
    }

    Gracias por la asesoria, me ha servido de mucho… xD
    Cualquier consulta a la orden al correo ramos.eder@hotmail.es

    1. Jeje, te hubiera contestado algo, pero la verdad es que no lo tenía claro (tendría que haberme puesto a probar), y lo has solucionado rápidamente :) .

  14. la verdad es que ahora necesito subir un archivo a un servidor remoto, sin embargo me gustaria obtener la ruta de enlace del archivo seleccionado Ejemplo: C://Mis Documentos/dibujo.jpg
    Pero lo estoy desarrollando con ActionScript 3.0 y estoy utilizando la clase FileReference pero no logro obtener la ruta de enlace!!

    Tienes informaciòn al respecto!?

  15. hola sabes probe con el codigo anterior ya que eso es lo unico que me falta por hacer y no me resulto
    en el formulario viene dado el nombre que quiero que tenga la imagen
    el formulario
    $idmaquina=$_GET['m'];
    la entrada del nombre
    <form action="upload.php?m=" method="post" enctype="multipart/form-data">
    <input type="hidden" name="nombre" value="">

    el codigo del archivo al que llama el formulario es el que sigue
    <?
    $idmaquina=$_GET['m'];
    $MAXIMUM_FILESIZE = 1024 * 200; // 200KB
    if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) {
    if (is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "/imagenes/".$_FILES['Filedata']['name']);
    rename("/imagenes/".$_FILES['Filedata']['name'], "/imagenes/".$idmaquina.".jpeg");
    echo "El archivo fue subido con exito";

    $nombre = $_POST["nombre"];
    echo "Se ha subido la imagen a la base de datos, puedes verla pulsando <a href="foto.php?n=$idmaquina" rel="nofollow">Aqui";
    }
    }
    else {
    echo "Error al cargar imagen: " . $_FILES['imagen']['name'];
    }
    ?>

    la carpeta imagenes tiene todos los permisos y esta en el servidor.
    cual puede ser mi error
    espero tu ayuda
    GRACIAS

    1. ¿Qué error obtienes exactamente? ¿Estás usando Windows u otro sistema operativo? Cuando publiqué el artículo, probé sólo sobre Windows (no tenía Mac ni una partición con Linux) así que es posible que no funcione correctamente fuera de Windows.

  16. hmmmm me resulta curioso dos cosas, la primera fue la linea de codigo
    echo “Error al cargar imagen: ” . $_FILES['imagen']['name']; habria ke hacer la prueba con la siguiente

    echo "Error al cargar imagen: ". $_FILES['Filedata']['name'];

    cuando copie el codigo al phpDesigner me dio varios errores kon respecto a las comillas dobles (pueda ser la konfiguracion reginal del teclado.. ) pego el codigo …

    <?php
    // revisar que no tenga espacio la etiqueta de apertura
    $idmaquina=$_GET['m'];
    $MAXIMUM_FILESIZE = 1024 * 200; // 200KB
    if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) {
    if (is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "/imagenes/".$_FILES['Filedata']['name']);
    rename("/imagenes/".$_FILES['Filedata']['name'], "/imagenes/".$idmaquina.".jpeg");
    echo "El archivo fue subido con exito";
    $nombre = $_POST["nombre"];
    echo "Se ha subido la imagen a la base de datos, puedes verla pulsando Aqui";
    }
    }
    else {
    echo "Error al cargar imagen: ". $_FILES['Filedata']['name'];
    }
    ?>

    me avisas cualquier cosa =P

    PD: a la consulta que habia realizado de obtener la ruta de enlace del archivo seleccionado por medio de ActionScript 3.0. solamente se puede hacer con la clase FILE, pero esta solo esta disponible para la version AIR (aplicaciones de escritorio) y explican que es por motivo de seguridad no esta disponible para apliciones con ambiente web… les pego el link

    http://livedocs.adobe.com/flex/3/langref/flash/fi

    saludos.-

    1. El problema que comentas de las comillas dobles es un problema de WordPress, que me sustituye algunas veces las comillas dobles " por comillas dobles torcidas “ . Ahora utilizo un plugin que además de evitar este tipo de problemas, colorea el código y añade numeración a las líneas, pero no he actualizado los artículos antiguos. Disculpa las molestias.

  17. Hola amigo, quiero subir archivos al servidor de una página pero algo hice mal. me podrias ayudar? el código en cuestión es:

    index.php

     
    <?php
    if (is_uploaded_file($_FILES['archivo']['tmp_name'])) {
    copy($_FILES['archivo']['tmp_name'], "ftp://miagenda.com.mx/public_html&quot;.$_FILES['archivo']['name'].'');
    $subido = true;
    }
    if($subido) {
    echo "El archivo ha sido subido con exito";
    } else {
    echo "Error: El archivo no ha sido subido";
    }
    ?>

    te agradezco tu ayuda de antemano…gracias.

    1. Me imagino que el problema es que intentas copiar por FTP sin iniciar sesión, lo que provocará un error de permisos, supongo.

      Utiliza una carpeta en su lugar.

Leave a Reply

Your email address will not be published.

Required fields are marked *

Your avatar