Foros del Web » Programando para Internet » PHP »

Descargar desde BD

Estas en el tema de Descargar desde BD en el foro de PHP en Foros del Web. Hola! He seguido este manual http://www.forosdelweb.com/f18/tutor...inario-127775/ y me surgen unas dudas que no he podido localizar en el foro, o no me han funcionado. ¿Puedo ...
  #1 (permalink)  
Antiguo 16/10/2016, 09:47
 
Fecha de Ingreso: octubre-2009
Mensajes: 299
Antigüedad: 14 años, 6 meses
Puntos: 2
Descargar desde BD

Hola!

He seguido este manual http://www.forosdelweb.com/f18/tutor...inario-127775/ y me surgen unas dudas que no he podido localizar en el foro, o no me han funcionado.

¿Puedo crear un página donde me aparezcan listados todos los archivos y yo le de a descargar a uno y me lo descargue?

Por ejemplo: Yo he subido 2 pdf de unas recetas, y alguien se quiere descargar solo uno.

Receta de ensalada con pollo
Receta de canelones

GRACIAS!!!
  #2 (permalink)  
Antiguo 16/10/2016, 12:03
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Descargar desde BD

Por supuesto que se puede, pero... ¿por qué guardas archvis PDF en la base de datos? Yo te recomendaría guardar los archivos en una carpeta del servidor y en la base de datos guardar la url de donde se encuentra el archivo, es mucho mejor por muchas razones. Razones de rendimiento de MYSQL, espacio en el servidor MYSQL, pero sobre todo, razones prácticas.

Es decir, te ahorrarás mucho código tanto al guardar los archivos en el servidor como a la hora de mostrarlos en la web ya que no necesitarás por ejemplo un archivo PHP para mostrar el documento que tengas guardado, como a la hora de descargarlo que te valdrá con DOWNLOAD de HTML5.
__________________
Diseño Web - Arisman Web
  #3 (permalink)  
Antiguo 16/10/2016, 12:42
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Descargar desde BD

Con estos tres simples archivos tendrías a modo básico lo que quieres hacer por completo. El formulario para subir las recetas, el script que guarda la receta y un archivo php que te las lista y te ofrece un link de descarga. Ahora solo tendrías que adaptarlo a tu proyecto para que se vea como quieres que se vea, pero como puedes comprobar es mucho más sencillo que ponerte a guardar los PDF en la base de datos y le ahorrarás muchos recursos al servidor MYSQL:

Formulario de subida: index.php

Código PHP:

<form action="save-receta.php" method="post" enctype="multipart/form-data">
<
label>Título: <input type="text" name="titulo" /></label>
<
label>Archivo pdf: <input type="file" name="pdf" /></label>
<
label>Descripción: <textarea name="descripcion"></textarea></label>
<
input type="submit" value="Guardar" />
</
form
Guardar archivo: save-receta.php

Código PHP:
<?php

require_once("conexionbd.php");
require_once(
"conexionftp.php");

/* POSTEAMOS LOS DATOS */

$tituloReceta $_POST['titulo'];
$descripcionReceta $_POST['descripcion'];
$archivo $_FILES['pdf'];

if(
$archivo['type'] != "application/pdf") {
    echo 
"El archivo que intentas subir no es un PDF";
    die();
}

/* CREAMOS LA CARPETA DE RECETAS */

if(!file_exists("archivos")) {
    
mkdir("archivos"0777true);
}
if(!
file_exists("archivos/recetas-cocina")) {
    
mkdir("archivos/recetas-cocina"0777true);
}

/*  ASIGNAMOS NOMBRE DEL ARCHIVO Y LA URL DE ÉSTE */

$nameArchivo mt_rand(0,999999999);
$urlFile 'archivos/recetas-cocina/'.$nameArchivo.'.pdf';

while(
file_exists($urlFile)){
    
$nameArchivo mt_rand(0,999999999);
    
$urlFile 'archivos/recetas-cocina/'.$nameArchivo.'.pdf';
}

/* COPIAMOS EL ARCHIVO */

if(!move_uploaded_file($archivo['tmp_name'] , $urlFile )) {
    echo 
"No pudo copiarse el archivo.";
    die();
}

/* GUARDAMOS LOS DATOS EN LA BASE DE DATOS */

$mysqli->query("INSERT INTO recetas (titulo, descripcion, urlpdf) VALUES ('".$tituloReceta."', '".$descripcionReceta."', '/".$urlFile."')");

if(
$mysqli->error) {
    
unlink($urlFile);
    echo 
"Hubo un error al guardar los dats en la base de datos: ".$mysqli->error;
    die();
}

/* REDIRECCIONAMOS A LISTADO DE RECETAS */

header("location: listar-recetas.php");

?>
Listar recetas con enlace de descarga: listar-recetas.php

Código PHP:
<?php

require_once("conexionbd.php");

$listado '';
$pRecetas $mysqli->query("SELECT * FROM recetas");
while(
$aRecetas $pRecetas->fetch_assoc()) {
    
$listado .= 'Receta '.$aRecetas['id'].': '.$aRecetas['titulo'].'<br /><br />
    '
.nl2br($aRecetas['descripcion']).'<br />
    <a href="'
.$aRecetas['urlpdf'].'" download="'.$aRecetas['titulo'].'">Descargar</a><br /><br />';
}

echo 
$listado;

?>
__________________
Diseño Web - Arisman Web

Última edición por manuparquegiralda; 16/10/2016 a las 13:13
  #4 (permalink)  
Antiguo 16/10/2016, 13:55
 
Fecha de Ingreso: octubre-2009
Mensajes: 299
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Descargar desde BD

Muchas gracias!

¿No faltarian estos archivos? conexionbd.php conexionftp.php

He dicho en el ejemplo que habia subido dos pdf, pero en verdad la idea es subir tambien imagenes.

Última edición por Vcnt; 16/10/2016 a las 15:11
  #5 (permalink)  
Antiguo 17/10/2016, 09:21
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 3 meses
Puntos: 11
Respuesta: Descargar desde BD

Es correcto guardar lo archivos en base de datos si la cantidad es bastante grande, digamos 5000 al día, también es correcto guardar en BD si la cantidad de archivos es muy dinámica, o si los archivos son menores a 1mg. Si los archivos son mayores a 1mg, o si la cantidad de archivos a almacenar es pequeña o muy estática, digamos 500 archivos en 3 años, conviene mas guardarlos a disco.

Un problema que se presenta muy grave al guardar archivos a disco, es la codificación de caracteres. Si se presentan caracteres raros al guardar a disco, terminaras devolviendo otros archivos que no corresponden o tal vez un error de que el archivo no existe. Si se te presentan caracteres raros en este link puedes encontrar como resolverlo

Si optas por la opción de guardar en base de datos, lo mas recomendable es tener dos bases; una con toda la logica de tu aplicacion y una tabla con un folio que indicara donde encontrar los archivos. La otra BD tendra solo una tabla con solo el folio correspondiente y los archivos. Esto es porque los binarios en la BD alentan los querys. Eso complica un poco la lógica de la aplicación pero si la cantidad de archivos es grande es mejor la BD como explica este link que es un articulo de investigación que compara el filesystem vs BD, contiene unas gráficas muy reveladoras. En ellas se observa como el filesystem es mejor cuando empiezas con la BD
y es mas rápido, pero conforme la cantidad de archivos crece, las gráficas se cruzan y la base de datos se vuelve mejor. Esto también explica porque la mayoría cree que es mejor el filesystem, y yo les respondería que depende. Si no existieran estas razones los campos CLOB y BLOB de las bases de datos no existirían.
  #6 (permalink)  
Antiguo 17/10/2016, 10:01
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Descargar desde BD

Cita:
Es correcto guardar lo archivos en base de datos si la cantidad es bastante grande, digamos 5000 al día, también es correcto guardar en BD si la cantidad de archivos es muy dinámica, o si los archivos son menores a 1mg. Si los archivos son mayores a 1mg, o si la cantidad de archivos a almacenar es pequeña o muy estática, digamos 500 archivos en 3 años, conviene mas guardarlos a disco.
No pretendo desmerecer tu comentario, pero de las conclusiones del pdf que pasas yo entiendo que SQL Server tiene un mejor rendimiento con archivos inferiores a 256 kilobytes, desde ahí hasta un megabyte no hay diferencia considerable entre NTFS y SQL Server, y a partir de un megabyte NTFS tiene una clara ventaja.

Por otro lado esas pruebas son válidas solo y solo para SQL Server, NO para MySQL que pudiera ser que en determinados casos sea mejor almacenar directamente en la base de datos, pero el artículo que aportas no es válido para este caso en concreto, ya que el usuario utiliza MySQL.
__________________
Unset($vida['malRollo']);
  #7 (permalink)  
Antiguo 17/10/2016, 10:50
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 3 meses
Puntos: 11
Respuesta: Descargar desde BD

Mis comentarios no solo se basan en ese articulo si no también en lecturas como de este libro
Título: Fundamentos de Bases de Datos
Editorial: Mcgrawhill
Autor: Silberschatz
Idioma: Español
Ahí comentan lo mismo, solo que no es especifico hacia una Base de datos, sino que habla de manera general y dado que tengo el libro físicamente no puedo poner un link. De la implementación de cada base de datos suele variar dependiendo de la estrategia utilizada en algoritmos internos de la base y obvio de la versión de la base, pero en 'general' lo que puse, lo puse para enfatizar que se deben poner en la balanza los pros y contras de lo que se requiere en el sistema para seleccionar la estrategia adecuada y no solo porque sí decir 'siempre filesystem' o 'siempre Base de datos', porque hacer eso puede derivar en que a la larga el sistema tenga problemas difíciles de solventar y se termine haciendo doble esfuerzo al cambiar de estrategia para intentar dar solución a los problemas generados por una inadecuada selección.
  #8 (permalink)  
Antiguo 17/10/2016, 12:28
 
Fecha de Ingreso: julio-2014
Ubicación: Montevideo
Mensajes: 78
Antigüedad: 9 años, 9 meses
Puntos: 2
Respuesta: Descargar desde BD

Cita:
Iniciado por manuparquegiralda Ver Mensaje
Por supuesto que se puede, pero... ¿por qué guardas archvis PDF en la base de datos? Yo te recomendaría guardar los archivos en una carpeta del servidor y en la base de datos guardar la url de donde se encuentra el archivo, es mucho mejor por muchas razones. Razones de rendimiento de MYSQL, espacio en el servidor MYSQL, pero sobre todo, razones prácticas.

Es decir, te ahorrarás mucho código tanto al guardar los archivos en el servidor como a la hora de mostrarlos en la web ya que no necesitarás por ejemplo un archivo PHP para mostrar el documento que tengas guardado, como a la hora de descargarlo que te valdrá con DOWNLOAD de HTML5.
Definitivamente yo te recomendaria hacer lo que te comenta el colega aquí, de esa forma te va a funcionar mejor y si los archivos PDF tienen nombres diferentes no tendrás conflictos, ya que vas a tener 2 guardados diferentes para cada archivo y la URL sera diferente. Saludos, espero te sirva
__________________
¿Necesitas Hosting Web? - [JSFIDDLE="www.intechservers.com/hosting"]Intech Servers Hosting[/JSFIDDLE]
¿Necesitas Sitio Web? - [JSFIDDLE="www.intechservers.com/web"]Intech Servers Web[/JSFIDDLE]
  #9 (permalink)  
Antiguo 17/10/2016, 13:26
 
Fecha de Ingreso: octubre-2009
Mensajes: 299
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Descargar desde BD

Son 5 archivos cada 2 o 3 meses, y cuando subo unos quito otros, y no pesan nada.

Voy a usar la recomendacion que me da, a ver si me puede aclarar los archivos que faltan pra poder descargarlos.

El siguiente paso sera poder eliminarlos!
  #10 (permalink)  
Antiguo 17/10/2016, 19:05
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 3 meses
Puntos: 11
Respuesta: Descargar desde BD

Si son 5 archivos cada 2 o 3 meses yo recomiendo guardarlos en disco. Agrégale fecha hora minutos y segundos al nombre del archivo para evitar duplicidades.
  #11 (permalink)  
Antiguo 23/10/2016, 10:24
 
Fecha de Ingreso: octubre-2009
Mensajes: 299
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Descargar desde BD

Hola,

Este código me envía a otro archivo donde abre el archivo. ¿como podría hacer para que directamente desde ahí descargara el archivo?

Código PHP:
<td><a href="archivo.php?id=<?php echo $datos['id_documento']?>"><?php echo $datos['nombre_archivo']; ?></a></td>

Etiquetas: bd
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




La zona horaria es GMT -6. Ahora son las 15:08.