Subir archivos al servidor en php

13 11 2008

Por medio de esta entrada pretendo dar una guía para subir archivos al servidor a través de un script en php y guardar la ubicación del archivo en una base de datos de MySQL, en ningún momento pretendo decir que es la solución óptima pero si es la más coveniente a mi parecer para analizar y mejorar….eso lo dirán los comentarios que dejen.

Primero que todo tenemos que tener los permisos necesarios para subir y guardar el archivo ‘777’ (Lectura, escritura y ejecución) y acontinuación haremos lo siguiente:

1) Creamos el formulario para seleccionar el archivo:

<form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data" name="form1">
<p align="center">Archivo
<input name="archivo" type="file" id="archivo">
</p>
<p align="center">
<input name="boton" type="submit" id="boton" value="Enviar">
</p>
</form>

Es necesario definir el atributo enctype como “multipart/form-data”, esto es así por que debemos enviar un archivo y que el formulario esta apuntado “form action ” a el archivo php actual ($PHP_SELF).

2) Creamos el script en php para subir el archivo, este puede ir al inicio del código

<?php

if (is_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name']))
{
  $local = $HTTP_POST_FILES['archivo']['name'];
  $remoto = $HTTP_POST_FILES['archivo']['tmp_name'];
  $tipo = $HTTP_POST_FILES['archivo']['type'];
  $extension = explode(".", $local);
  
  switch($tipo)
  {
    case "image/jpeg":
    // La variable para la BD
    $ruta = "Imagenes/JPG/" . $local;
    if(move_uploaded_file($remoto, $ruta))
    {
      $db_conexion = mysql_connect("servidor", "usuario", "contraseña");
      mysql_select_db("upload");
     
      mysql_query("INSERT INTO nom_tabla VALUES('','$local','$tipo','$ruta')")
      or die (mysql_error());
      mysql_close();
      echo "<br><b>Imagen subida correctamente</b></br>";
    }
    else
      echo "Error al Mover el archivo";
    break;
    case "image/png":
    // La variable para la BD
    $ruta = "Imagenes/PNG/" . $local;
    if(move_uploaded_file($remoto, $ruta))
    {
      $db_conexion = mysql_connect("servidor", "usuario", "contraseña");
      mysql_select_db("upload");
      mysql_query("INSERT INTO nom_tabla VALUES('','$local','$tipo','$ruta')")
      or die (mysql_error());
      mysql_close();
      echo "<br><b>Imagen subida correctamente</b></br>";
    }
    else
      echo "Error al Mover el archivo";
    break;
    case "image/gif":
    // La variable para la BD
    $ruta = "Imagenes/GIF/" . $local;
    if(move_uploaded_file($remoto, $ruta))
    {
      $db_conexion = mysql_connect("servidor", "usuario", "contraseña");
      mysql_select_db("upload");
      mysql_query("INSERT INTO nom_tabla VALUES('','$local','$tipo','$ruta')")
      or die (mysql_error());
      mysql_close();
      echo "<br><b>Imagen subida correctamente</b></br>";
    }
    else
      echo "Error al Mover el archivo";
    break;
  default:
    echo "<br><b>El archivo debe ser imagen</b></br>";
    break;
  }
  die();
}
?>

Si te ha gustado este post y/o te ha servido de ayuda puedes dejar un comentario, esa es una forma de agradecer y de incentivar a la gente para que siga trabajando en esta comunidad….

En este caso he utilizado una tabla con el Id_archivo, Normbre_archivo, Tipo_archivo y Ubicación, respectivamente, ha sido testeado y ha respondido bien, si quieren agregarle que busque el archivo antes de agregarlo para ver si ya existe pueden, colocarle una consulta y determinando el el número de resultados darán las opciónes necesarias…

Otra observación y es que me hizo falta definir es cuando se le da click en enviar con el formulario vacío, allí hay que definir si la variable “archivo” esta vacía, si lo necesitan, pueden dejar un comentario…

Si te ha gustado este post, puedes dejar un comentario como agradecimiento, así incentivas a que sigamos publicando temas de interés.


Acciones

Information

8 responses

15 11 2008
yey

Gracias estoy analizando y probando……

20 12 2008
yey

bueno compañeros de ZdeS me disculpo por la demora en contestar el post es q no e tenido mucho tiempo libre.
les agradesco por montar una solucion a mi problema he puesto a correr el codigo y la verdad me toco hacer varios cambios para q me funcionara, uno de los mas importantes es q cuando pegue el codigo en dreamweaver las comillas q estan utilizando en el codigo no son las q reconoce php no c si ese es problema del editor q utilizaron para dar solucion a mi duda pero es solo cambiar las comillas bueno aqui les dejo el codigo q modifique:

<?php
if($boton)
{
if (is_uploaded_file($_FILES["archivo"]["tmp_name"]))
{
$local = $_FILES['archivo']['name']; //nombre del archivo
$remoto = $_FILES['archivo']['tmp_name'];//nombre del archivo en la carpte atem de windows
$tipo = $_FILES['archivo']['type'];// muestra el tipo de imagen
$extension = explode(" ",$local);

switch($tipo)
{
case "image/jpeg":
// La variable para la BD
$ruta = "imagenes/jpg/" . $local;
if(move_uploaded_file($remoto, $ruta))
{
$db_conexion = mysql_connect("localhost", "root", " ");
mysql_select_db("upload");
$sql="INSERT INTO imagen (Id_archivo,Normbre_archivo,Tipo_archivo,Ubicacion) VALUES (' ','$local','$tipo','$ruta')";
mysql_query($sql);
mysql_close();
echo "Imagen subida correctamente";
}

else
echo "Error al Mover el archivo";
break;

default:
echo "El archivo debe ser imagen";
break;
}
}
}
?>

Documento sin título

<form action="" method="post" enctype="multipart/form-data" name="form1">
Archivo

nota: les pego a continuacion el sql de la base de datos:
CREATE DATABASE `upload` ;

CREATE TABLE `imagen` (
`Id_archivo` int(11) NOT NULL auto_increment,
`Normbre_archivo` varchar(21) NOT NULL default ”,
`Tipo_archivo` varchar(20) NOT NULL default ”,
`Ubicacion` varchar(50) NOT NULL default ”,
PRIMARY KEY (`Id_archivo`)
) TYPE=MyISAM AUTO_INCREMENT=6 ;

8 02 2011
axel

amigo por q el action no hay nada .. zorry mi ingnoracia o funciona con el mismo formulario de arriba

20 03 2009
arturo

Lo voy a provar ahora mismo. Me parece muy bueno el ejemplo puesto. Muchas Gracias desde Zaragoza.

1 04 2009
Elias

esta muy bueno el codigo
pero tengo una preguna como pongo la ruta si estoy en remoto en la cual el servisor esta un linux:
$ruta=”localhost/modelo/fotografias”; no sube mi archivo alguien que me puede contestar

1 04 2009
Elias

mi ruta es $ruta=”public_html/sis_en_linea1/modelo v2/fotografias/”;
pero no puedo subir

1 04 2009
argordmel

Te aseguraste de que tenga los permisos de ejecución esa carpeta. Lo más probable es que se te ha pasado por alto.

$ sudo chmod 777 nombre_de_carpeta

El permiso debe ser carpeta a carpeta.

Agur y cualquier cosa me comentas.

8 06 2011
bacodesign

Muchas gracias por el codigo, anduvo de 10! hay que sustituir $HTTP_POST_FILES por $_FILES ya que aparece deprecated.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: