Foros del Web » Programando para Internet » PHP »

Problema con descarga desde bd.

Estas en el tema de Problema con descarga desde bd. en el foro de PHP en Foros del Web. Bueno, he estado mirando por el foro sobre el tema de forzar descargas desde una base de datos.. y aunque he probado varios codigos no ...
  #1 (permalink)  
Antiguo 05/11/2006, 11:54
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Problema con descarga desde bd.

Bueno, he estado mirando por el foro sobre el tema de forzar descargas desde una base de datos.. y aunque he probado varios codigos no consigo que se me descargue el archivo.

Tengo almacenados en una tabla de mi base de datos, unos arhivos con extension .wsc, de tipo text/scriptlet.

Os muestro mi codigo:

Código PHP:
// Este es el archivo de descargar_scheme.php que recibe id como parametro.
<?
include("config.php");
$conn mysql_connect($host$user_name$password) or die('Could not connect: ' mysql_error());
mysql_select_db($database_name) or die('Could not select database');


 
$qry "SELECT scheme FROM schemes WHERE id=$id";
 
$res mysql_query($qry) or die (mysql_error());
 
$contenido mysql_result($res0"scheme");


header("Content-type: text/scriptlet");
print 
$contenido
 
 
?>
Y el enlace que muestro para cada arhivo es este:

Código PHP:
print "<a href='descargar_scheme.php?id=$tb[id]'>Descargar</a> 
Que hago mal? he visto que otros codigos descargan el fichero desde una carpeta poniendo una ruta... pero yo querria poder descargarlo desde la bd directamente.

Gracias de antemano, aver si alguien me puede guiar un poco.
  #2 (permalink)  
Antiguo 06/11/2006, 01:08
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
alguna ayudita?
  #3 (permalink)  
Antiguo 06/11/2006, 05:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Veamos por partes.

1) Al ejecutar directamente tu script de proceso:
http://www.tal.tal/'descargar_scheme.php?id=1

Que obtienes? .. donde id= será una referencia de tus registros que sepas que contiene datos.

2) Seguro que el link que ahí representas en:
print "<a href='descargar_scheme.php?id=$tb[id]'>Descargar</a>

Toma el valor adecuado $tb[id] y se genera el HTML de ese link correctamente? (lo puedes ver en tu navegador -> ver código fuente).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 06/11/2006, 12:27
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Al hacer http://localhost/descargar_scheme.php?id=1 me sale una pagina en blanco... sin nada mas :S

El link toma el valor adecuado, es decir, el link que se genera para el archivo en la posicion 1 es: <a href='descargar_scheme.php?id=1'>Descargar</a>

Lo he probado en varios navegadores y pasa lo mismo... el codigo es seguido a traves de un manual y adaptado unicamente :S...

Que puede ser?

Saludos.
  #5 (permalink)  
Antiguo 06/11/2006, 12:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Comenta la línea del header() de tu código y repite el paso 1 .. Deberías ver el código de tu imagen (algo como "hexadecimal" y caracteres "raros").

Así confirmamos que tu consulta SQL a tu BBDD es correcta y entrega los datos que se piden.

De todas formas .. si tu quieres que esos archivos se "descarguen" .. no estás indicando ninguna cabecera HTTP que fuerce la descarga ..

Debería ser algo tipo:

Código PHP:
<?php
header
('Content-Type: application/octet-stream'); // o el formato MIME del archivo real.
header("Content-Disposition: attachment; filename=\"".basename($nombre_archivo)."\";");
echo 
$contenido;
?>
Puedes ver más cabeceras HTTP en:
www.php.net/header

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 06/11/2006, 12:53
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
He suprimido el header, y sigue pasando lo mismo, se me muestra una pagina en blanco a secas.

Significa eso que el enlaze con la base de datos es erroneo?
  #7 (permalink)  
Antiguo 06/11/2006, 12:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por AbdelioR Ver Mensaje
He suprimido el header, y sigue pasando lo mismo, se me muestra una pagina en blanco a secas.

Significa eso que el enlaze con la base de datos es erroneo?
Pues tienes muchas probabilidades que tengas problemas con tu consulta SQL en su ejecucíón.

No sé si tienes activado el "display_errors" (php.ini) y por eso no ves ningún mensaje de error .. o bien es de SQL (o conexión) ...

Intenta usar para las pruebas (sin el header() todavía):

Código PHP:
error_reporting(E_ALL); 
Al principio de tu script .. antes de tu include() ...

Y usar en lugar de
<?

usa:
<?php

A todo esto .. tu estás seguro que el campo:
"scheme" de la tabla "schemes" contiene datos? .. (revisalo con algún GUI para Mysql: phpMyadmin o lo que uses).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 06/11/2006, 13:03
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Pregunta

Código PHP:
<?php
header
('Content-Type: application/octet-stream'); // o el formato MIME del archivo real.
header("Content-Disposition: attachment; filename=\"".basename($nombre_archivo)."\";");
echo 
$contenido;
?>
Cluster, este código que acabas de mencionar me sirve para descargar archivos???

saludos??
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #9 (permalink)  
Antiguo 06/11/2006, 13:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Carxl Ver Mensaje
Código PHP:
<?php
header
('Content-Type: application/octet-stream'); // o el formato MIME del archivo real.
header("Content-Disposition: attachment; filename=\"".basename($nombre_archivo)."\";");
echo 
$contenido;
?>
Cluster, este código que acabas de mencionar me sirve para descargar archivos???

saludos??
El código es muy básico .. pero podría funcionar. Todo depende de donde obtengas tu archivo.

Si el archivo lo lees de un directorio de tu servidor en lugar de "echo" tendrías que usar readfile().

Tienes más ejemplos en la documentación de:

header()
www.php.net/header
(sobre todo en los comentarios de los usuarios de esa función).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 06/11/2006, 16:31
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Bueno... he decidido guardar los ficheros en un directorio en vez de en la base de datos por que ya me lo ha dicho mas de uno, asi que vamos a hacer caso...

Este es mi codigo de descarga.

Código PHP:
 $tabla "SELECT * FROM schemes WHERE id=$id";  
 
$row mysql_fetch_array$tabla );
 
$ruta $row['ruta'];   //la ruta sera del tipo   /scheme/nombrefichero
 
$nombre $row['nombre']; //nombre del fichero a secas.

header ("Content-Type: text/scriptlet");
header ("Content-Disposition: attachment; filename=".$nombre." ");
readfile($ruta); 

Pero en vez de descargar el archivo, me descarga el script.php

:S
  #11 (permalink)  
Antiguo 07/11/2006, 05:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por AbdelioR Ver Mensaje
Bueno... he decidido guardar los ficheros en un directorio en vez de en la base de datos por que ya me lo ha dicho mas de uno, asi que vamos a hacer caso...

Este es mi codigo de descarga.

Código PHP:
 $tabla "SELECT * FROM schemes WHERE id=$id";  
 
$row mysql_fetch_array$tabla );
 
$ruta $row['ruta'];   //la ruta sera del tipo   /scheme/nombrefichero
 
$nombre $row['nombre']; //nombre del fichero a secas.

header ("Content-Type: text/scriptlet");
header ("Content-Disposition: attachment; filename=".$nombre." ");
readfile($ruta); 

Pero en vez de descargar el archivo, me descarga el script.php

:S
Una cosa es que el nombre del archivo a descargar se te ofrezca "script.php" y otra el contenido de ese script en sí.

Edita tu archivo descargado y verifica que contiene. Mucho navegador no interpreta correctamente las cabeceras HTTP que indican el nombre del archivo a la primera.

Y como te dije . .revisa la documentación de PHP .. eso que envias en "header()" es parte del protocolo HTTP . .cuanto más sepas de el mejor te irá para este tema de descargas. OJO como también te comento, no todo navegador o "cliente" mejor dicho se comporta igual ante las mismas cabeceras HTTP (y esto es por qué no todo navegador sigue las especificaciones del protocolo HTTP al 100% ... (sobre todo IE, en algunas versiones)).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 08/11/2006, 14:57
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Bueno, al fin lo he conseguido. Mi script final, al que le paso el nombre del fichero como parametro, es este:

Código PHP:

<?php

$carpeta
="./schemes/";

if(
file_exists($carpeta.basename($_GET['file'])))
{
   
$file=$carpeta.$_GET["file"];
   
header("Content-Transfer-Encoding: binary");  
   
header("Content-type: text/scriptlet");  
   
header("Content-Disposition: attachment; filename=".basename($file));  
   
header("Content-Length: ".filesize($file));    
   
readfile($file);
}
else
{
 echo 
"Usted esta accediendo a un archivo que no existe en la carpeta de descargas. El fichero ke kieres se llama $fichero";
}
?>
Saludos ^^
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 18:55.