Foros del Web » Programando para Internet » PHP »

subida de varios archivos almacenamiento en la base de datos y descarga de los mismos

Estas en el tema de subida de varios archivos almacenamiento en la base de datos y descarga de los mismos en el foro de PHP en Foros del Web. Bueno con el fin de aportarle algo a esta web q me ha dado tanto les traigo este pequeño aporte espero q les sea util. ...
  #1 (permalink)  
Antiguo 30/05/2011, 08:03
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 12 años, 10 meses
Puntos: 1
subida de varios archivos almacenamiento en la base de datos y descarga de los mismos

Bueno con el fin de aportarle algo a esta web q me ha dado tanto les traigo este pequeño aporte espero q les sea util.

Subir archivos es ahora de vital importancia en cualquier web, subir uno es relativamente facil pero subir varios ya es otro cuento, pero todo va por partes.

1ero. subir un archivo.

lo primero es crear el formulario de subida

Código HTML:
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" name="frmLogin" enctype="multipart/form-data">							
Archivo:
<input name="file"  type="file" />
<input type="submit" value="Inscribir" name="iniciar" />
<input type="button" value="Reset" onclick="valid.reset(); return false"/>
</form> 
como vemos en el action tengo
Código PHP:
"<?php echo $_SERVER['PHP_SELF'];?>"
lo que indica q la misma pagina q contiene el formulario es la procesa el formulario, pero en realidad puede ser cualquier pagina donde lo quieran enviar.

Lo mas importante es que la cabecera del formulario tenga esta sentencia:
Código HTML:
enctype="multipart/form-data"
, para que pueda procesar los archivos del formulario.

segundo el codigo php

Aclaracion: el codigo es una modificacion de dos codigos encontrados en este mismo foro, pero no recuerdo los usuarios, si alguien lo sabe q me envie un mensaje para poder darles credito.

Código PHP:
$foto = isset($_POST["file"])? $_POST["file"]: '';//verifica si se envio el archivo

//se configuran los parametros de subida
$folder "docs/"// Carpeta a la que queremos subir los archivos
$maxlimit 50000000000// Máximo límite de tamaño (en bits)
$allowed_ext "rar,jpg,bmp,jpeg"// Extensiones permitidas (usa una coma para separarlas)
$overwrite "no"// Permitir sobreescritura? (yes/no)
$match ""
$filesize $_FILES['file']['size']; // toma el tamaño del archivo
$str "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
$filename "";
$error="";

//se le da un nombre aleatorio al archivo
for($i=0;$i<12;$i++) 
{
$filename .= substr($str,rand(0,62),1);}                                        

if(!
$filename || $filename==""// mira si no se ha seleccionado ningún archivo
{$error "- Ningún archivo selecccionado para subir.<br>";}

elseif(
file_exists($folder.$filename) && $overwrite=="no")// comprueba si el archivo existe ya
$error "- El archivo <b>$filename</b> ya existe<br>";}

// comprobar tamaño de archivo

if($filesize 1// el archivo está vacío
{$error .= "- Archivo vacío.<br>";}
elseif(
$filesize $maxlimit// el archivo supera el máximo
{$error .= "- Este archivo supera el máximo tamaño permitido.<br>";}

$sep=explode('image/',$_FILES["file"]["type"]);
$tipo=$sep[1];

if(
$tipo == "gif" || $tipo == "jpeg" || $tipo == "jpg" || $tipo == "bmp")
{
$match "1"// Permite el archivo}                    

if(!$match)
{
$error .= "- Este tipo de archivo no está permitido: $tipo<br>";}    

if(
$error)
{print 
"Se ha producido el siguiente error al subir el archivo:<br> $error"// muestra los errores}

else
{
move_uploaded_file($_FILES['file']['tmp_name'], $folder.$filename.'.'.$tipo);} 
como podemos ver al dar un nombre aleatorio al archivo la probabilidad de sobre escritura es una en 100000000000000000000000000000, pero si no quieres generar un nombre aleatorio puedes remover la parte del for y el filename y el se guardara con el nombre original y en caso de existir otro en el servidor simplemente se sobreescribira o no dependiendo el valor q tenga la variable $overwrite.

Nota: es estrictamente necesario que el name del input en el q se guarda el archivo sea igual a parametro q toman las variables q manejan el archivo en este caso file

tercero guardarlo en la base de datos:

para q subirlo sino sabemos donde quedara, por eso lo guardaremos en la base de datos asi:
Código PHP:
$conexion = new mysqli("servidor","user","pass","base_datos");    
if(
$conexion)
{    

$insercion "INSERT INTO tabla VALUES ('".$folder.$filename.".".$tipo."')";
$result $conexion->query($insercion);        
$row_cnt $conexion->affected_rows;

if(
$row_cnt 0)
{echo 
"archivo almacenado en la base de datos";}    

else
{echo 
"archivo no almacenado";}                            

}
else
{echo 
"no hay conexion";} 
  #2 (permalink)  
Antiguo 30/05/2011, 08:21
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

2do subir varios archivos a la vez y almacenarlos en la base de datos:

primero el codigo html:

Código HTML:
<form action="<?php echo $_SERVER['PHP_SELF']; ?> method="POST"  name="frmLogin" enctype="multipart/form-data">							
Documento 1:
<input type="file" name="archivos[]"/>
Documento 2:
<input type="file" name="archivos[]"/>
Documento 3:
<input type="file" name="archivos[]"/>
Documento 4:
<input type="file" name="archivos[]"/>
<input type="submit" value="Enviar" name="envia"/>
</form> 
En este caso vamos a subir cuatro archivos, en la web existen varios metodos para subir x cantidad de archivos estilo Gmail pero este no es el caso ya que los q vamos a subir son fijos.

Nota: es importante que el name de los input tengan [] al final ya que indica que hacen parte de un vector.

bueno ahora los vamos a subir y almacenar en la base de datos veran q la diferencia entre subir uno o varios es recorrer el vector que en este caso se llama archivos:
Código PHP:
if( isset($_POST["envia"]) )
{    

if (isset (
$_FILES["archivos"])) 
{         

//iniciamos la configuracion

$folder "docs/";//carpeta en donde se subiran los archivos
$maxlimit 50000000000
$allowed_ext "rar,jpg,bmp,jpeg,gif";
$overwrite "no";
$match "";
$str "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";                            
$error="";
$cad[]="";
$tot count($_FILES['archivos']['name']);//esta seccion cuenta la cantidad de los archivos enviados pero como dijimos q era fijo no lo vamos a necesitar en caso de que lo quieran dinamicos pues lo usan si no no

for ($i 0$i $tot$i++)//recorremor el vector archivos[]

$filename "";
$filesize $_FILES['archivos']['size'][$i];
$archivo=$_FILES['archivos']['tmp_name'][$i];                        
$sep=explode("image/",$_FILES['archivos']['type'][$i]);                
$tipo=$sep[1];                                        

for(
$j=0;$j<12;$j++) 
{
$filename .= substr($str,rand(0,62),1);}

if(!
$filename || $filename=="")
{
$error "- Ningún archivo selecccionado para subir.";}

elseif(
file_exists($folder.$filename) && $overwrite=="no")
$error "- El archivo $filename ya existe";}

if(
$filesize 1)
{
$error .= "- Archivo vacío.";}

elseif(
$filesize $maxlimit)
{
$error .= "- Este archivo supera el máximo tamaño permitido.";}
                                    
if(
$tipo == "gif" || $tipo == "jpeg" || $tipo == "jpg" || $tipo == "bmp")
{
$match "1";}

if(!
$match)
{
$error .= "- Este tipo de archivo no está permitido: $tipo";}    

if(
$error)
{print 
"Se ha producido el siguiente error al subir el archivo: $error";}

else
{
$destino $folder.$filename.'.'.$tipo;

if(
move_uploaded_file($archivo$destino))
{
$cad[$i] = $destino;}

else
echo 
"archivo no subido";
}                                                   
}                            
$conexion = new mysqli("servidor","user","pass","base_datos");    

if(
$conexion)
{
$numced $sesion->get("cedpart");
$insercion "INSERT INTO documentos VALUES ('".$cad[0]."','".$cad[1]."','".$cad[2]."','".$cad[3]."')";

$result $conexion->query($insercion);            

if(
$row_cnt 0)
{echo 
"archivo almacenado en la base de datos";}    

else
{echo 
"archivo no almacenado";}                            

}
else
{echo 
"no hay conexion";}              } 
como vemos almacenamos las cadenas de ruta/archico.tipo en una cadena y esa cadena es la que utilizamos como variable para el ingreso a la base de datos
  #3 (permalink)  
Antiguo 30/05/2011, 08:31
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

3ero vamos a descargar los archivos subidos al servidor y q mejor q hacerlos en un .zip

para ello necesitaremos este archivo http://www.devco.net/code/zipfile.inc.txt, lo renombraremos zipfile.php y lo alojaremos donde tengamos nuestra pagina.

despues haremos un aconsulta para saber donde guardamos los archivos segun la <condicion> q se hizo cuando se subieron los archivos en la segunda parte de este aporte.

Código PHP:

$conexion 
= new mysqli("servidor","user","pass","base_datos");
if(
$conexion)
{        
$consulta "SELECT * FROM documentos WHERE <condicion>";    
$result$conexion->query($consulta);

$docud $docus->fetch_assoc();//asociamos los resultados de la consulta con su cabecera en este caso la cabecera de los campos es doc1, doc2,doc3, que son los campos donde se guardan las direcciones de los archivos

//$zipfile->add_file(implode("",file("ubicacion_del_archivo")), "nuevo_nombre.extension");
$zipfile->add_file(implode("",file("$docud[doc1]")), "doc01.jpeg");
$zipfile->add_file(implode("",file("$docud[doc2]")), "doc02.jpeg");
$zipfile->add_file(implode("",file("$docud[doc3]")), "doc03.jpeg");
$zipfile->add_file(implode("",file("$docud[doc4]")), "doc04.jpeg");

header("Content-type: application/octet-stream");

//asociamos los archivos y los empaquetamos en un archivo llamado documentos
header("Content-disposition: attachment; filename=documentos.zip");

//finalmente imprimimos el archivo osea q el navegador lo descargara.
echo $zipfile->file();
}

eso es todo amigos espero q les haya gustado...


nos leemos despues.
  #4 (permalink)  
Antiguo 17/12/2011, 17:37
 
Fecha de Ingreso: diciembre-2011
Mensajes: 3
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

Hola excelente tu aporte!! me sirvio de mucho, solo que tengo unos problemas porque yo deseo subir archivos word y ya hice el cambio en la parte de las extensiones:
$allowed_ext = "rar,jpg,bmp,jpeg,gif";

y en $tipo coloque msword en lugar de:
if($tipo == "gif" || $tipo == "jpeg" || $tipo == "jpg" || $tipo == "bmp")

pero me dice que guardo el archivo y cuando voy a la base de datos me muestra de tamaño 22 bytes, pareciera que no lo esta guardando completo, y cuando intento descargarlo estan vacios o no lo descarga, pienso que es porque no estoy colocando bien algo en lo de la extension y tengo problemas con los .docx que no los sube.
Gracias de antemano!
  #5 (permalink)  
Antiguo 18/12/2011, 12:41
 
Fecha de Ingreso: agosto-2006
Mensajes: 92
Antigüedad: 17 años, 8 meses
Puntos: 0
Información Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

Hola.
Primero que todo muchas gracias por el excelente aporte.
Segundo,tengo una duda. Es con respecto a como hacer para pasar ciertos datos de una web para despues imprimirlos en una impresora termica. En resumen esto es lo que poseo y lo que deseo hacer:

Tengo una web.
Requiero sacar ciertos datos: fono, direccion y una pequeña descripcion.
Luego presionar un boton imprimir y los datos mencionados se van a una impresora termica.

En estricto rigor, para tomar estos datos debo tenerlos almacenados en una BD? y despues extraerlos mediante consultas sql?

Alguien tiene algun codigo para ayudarme?

Muy agradecido.

Saludos!
  #6 (permalink)  
Antiguo 03/02/2012, 10:40
 
Fecha de Ingreso: mayo-2011
Mensajes: 47
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

Cita:
Iniciado por zaitzo Ver Mensaje
Hola excelente tu aporte!! me sirvio de mucho, solo que tengo unos problemas porque yo deseo subir archivos word y ya hice el cambio en la parte de las extensiones:
$allowed_ext = "rar,jpg,bmp,jpeg,gif";

y en $tipo coloque msword en lugar de:
if($tipo == "gif" || $tipo == "jpeg" || $tipo == "jpg" || $tipo == "bmp")

pero me dice que guardo el archivo y cuando voy a la base de datos me muestra de tamaño 22 bytes, pareciera que no lo esta guardando completo, y cuando intento descargarlo estan vacios o no lo descarga, pienso que es porque no estoy colocando bien algo en lo de la extension y tengo problemas con los .docx que no los sube.
Gracias de antemano!
Hola q pena la demora si todavia lo necesitas, el formato de los archivos de word no es msword es o doc y docx ademas recuerda que nososotros convertimos el formato en jpeg antes de subirlo para tener homogeneidad en los datos es probable que esa sea la causa de tu problema, ademas exitste en la parte del codigo un cambio de extension y al no encontrarlos es probable que no lo descargue concretamente cuando se van a descargar. si siqgues con tu problema.. solo pregunta...}

[Edito]

Recuerda que cuando vamos a descargar reemplazmaos la extension en dado caso que tengas un doc y tu quieras alterar su extension este se va a dañar y viceversa por eso es mejor que tomes el nombre original y la extension y la albergues en la variable de nuevo nombre para la descarga
  #7 (permalink)  
Antiguo 07/02/2012, 20:03
 
Fecha de Ingreso: febrero-2012
Mensajes: 19
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: subida de varios archivos almacenamiento en la base de datos y descarga de

Excelente aporte khryztall!!!

Realmente estaba buscando algo así, pero en cierto modo necesito algo diferente.

Quisiera saber si conoces un código que me permita subir imagenes al servidor y que guarde a la par las urls en la base de datos.

Por ejemplo, en un sistema de usuarios donde cada uno tiene su propio id se suba un máximo de 5 imagenes y que se guarde la url de cada una en un campo distinto en la misma tabla dentro de la Base de Datos pero sin salir de la id del usuario, o sea, que no se autoincremente.

Pero todo enviado con un único botón SUBMIT que estará al final del formulario donde se encuentran los campos.

Ojalá puedas ayudarme, me estoy iniciando en el mundo de PHP y por ahora me resulta complicado realizar un script de ese tipo.

Etiquetas: almacenamiento, descarga, subida
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:50.