Foros del Web » Programando para Internet » PHP »

Descargar archivos

Estas en el tema de Descargar archivos en el foro de PHP en Foros del Web. Hola a tod@s. Llevo todo el día peleandome con google y distintos foros para encontrar como solucionar esto pero no lo consigo, así que he ...
  #1 (permalink)  
Antiguo 09/03/2007, 14:36
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Descargar archivos

Hola a tod@s.

Llevo todo el día peleandome con google y distintos foros para encontrar como solucionar esto pero no lo consigo, así que he optado por preguntar a ver si alguien puede ayudarme.

El caso es que quiero permitir la descarga de una serie de archivos (quería en zip pero acabé probando en png directamente, no sé si habrá diferencia) pero contando las veces que se descargaban (en realidad las veces que se cliqueaba sobre el enlace de descarga porque en caso de cancelar, igual cuenta como una descarga)
Bueno, pues yo jamás había hecho descargas de otra forma distinta a la etiqueta <A>, así que al meterme en PHP se me complicó la cosa.
Encontré que tenía que utilizar "Header" con una serie de parámetros, pero el problema es que no encuentro información detallada en español sobre los mismos y no sé si son estos los que están impidiendo que funcione mal la cosa.

Bueno, tengo un enlace que pasa la variable $id al archivo php que tiene este código:

Código PHP:
<?
$id
=$_GET["id"];

//conecto la base de datos
include('libre_bd.php');
llamar_base();

//busco en la bd la id que me pasa el enlace
$consulta="select * from descargas where id=$id";
$resultado=mysql_query($consulta);
if(
$filas=mysql_fetch_array($resultado)){
//sumo una descarga al campo de la bd
    
$descargas=$filas['descargas']+1;
    
$sumar=mysql_query("update descargas set descargas=$descargas where id=$id");
//empiezo con la descarga
    
$archivo=$filas['archivo'];
    
header("Content-Transfer-Encoding: binary");
    
header("Content-type: application/force-download"); 
    
header("Content-Disposition:attachment; filename=$archivo");
    
readfile("http://www.misito.tal/downloads/$archivo");
}else{
    echo 
"<P>El archivo no se encuentra actualmente disponible para descarga</P>";
}
    
?>
No sé si los header que estoy utilizando son los adecuados. En algún momento he utilizado también header ("Content-Type: application/octet-stream"); en vez de force-download, pero tampoco funciona.
También he probado distintas formas de hacer referencia a la ruta del archivo (se supone que está en la carpeta downloads, la cual se encuentra en el mismo sitio que el archivo que hace la llamada), desde "http://misito.tal/downloads/$archivo, hasta solo downloads/$archivo e incluso la ruta absoluta del servidor (no sé como se llama en realidad, esa larga que consta de un montón de directorios que te proporciona el hosting)
Lo más que he conseguido es que me salga el cuadrito de diálogo que permite abrir o guardar, pero no funciona. Si le doy a abrir, me dice "vista no disponible" y si le doy a guardar hace la descarga, incluso reconoce el tipo de archivo pero cuando lo abro me dice tb que la vista no está disponible o si lo abró con un programa algún error de no se puede abrir.
He probado tanto con Explorer como con Firefox y falla con los dos, pero ahora mismo me urge más solucionarlo para IE.
¿Alguien puede ayudarme a encontrar lo que tengo mal o información para poder solucionarlo?
Muchas gracias de antemano
  #2 (permalink)  
Antiguo 09/03/2007, 16:40
Avatar de jimi  
Fecha de Ingreso: mayo-2006
Ubicación: La Plata, Bs As, Argentina
Mensajes: 60
Antigüedad: 18 años
Puntos: 0
Re: Descargar archivos

Hola, mira, te paso un codigo que utilizo para bajar archivos .tar.. espero que te sirva..

Código HTML:
<?php 
$archivo=$_POST['archivo'];

function Descargar($ElFichero){ 

    $TheFile = basename($ElFichero); 
         
    header( "Content-Type: application/octet-stream");  
    header( "Content-Length: ".filesize($ElFichero));  
    header( "Content-Disposition: attachment; filename=".$TheFile."");  
    readfile($ElFichero); 
} 
Descargar($archivo); 
?> 
saludo
__________________
Puntovista
  #3 (permalink)  
Antiguo 09/03/2007, 16:57
 
Fecha de Ingreso: marzo-2007
Mensajes: 78
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Descargar archivos

Yo lo hago así... igual te vale. Suerte!

Código PHP:
<?   
   $nombre 
$_GET['nombre'];
   
$path $_GET['path'];
   
   if ( 
file_exists($path $nombre) ){
      
header("Content-type: application/octet-stream");
      
header("Content-Disposition: attachment; filename=$nombre");
      
header("Pragma: no-cache");
      
header("Expires: 0");
      
      if (
$file fopen($path $nombre,"r")){
         while (!
feof($file)){
            
$aux fgets($file,4096);
            echo 
$aux;
         }
         
fclose($file);
      }
   }
?>
  #4 (permalink)  
Antiguo 10/03/2007, 12:10
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Re: Descargar archivos

Voy a probar con ambos a ver que pasa.

Otra cosa, me gusta aprovechar para aprender un poco más cuando pregunto y la verdad que el código de este último script no alcanzo a entenderlo muy bien :( podrías explicarme más o menos que es lo que pasa en ese if??

Y por último, no sabeis de donde puedo obtener información sobre este tema en castellano? es que creo que es bastante util, pero así a ciegas no se puede llegar muy lejos no?? ;)

Gracias a los dos por contestar :)
  #5 (permalink)  
Antiguo 12/03/2007, 10:20
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Re: Descargar archivos

Pues he probado ambas formas y no hay forma :( Cuando lo pruebo con el script de jimi, en local me dice que no se pueden cambiar las cabeceras (Por cierto hay que configurar algo en el ini para usar header??) y debajo de los errores me aparece código (como cuando abres un zip o algo así con el bloc de notas) eso sí, el archivo lo está reconociendo porque entre lo poco que se entiende consigo leer el nombre del archivo que está en el zip); cuando lo uso en internet me aparece la ventana de descarga pero el archivo se descarga como en 2 segundos (pesa unos 700kb) y cuando lo intento abrir me dice que nanai de la china, que no está completo.

Con el scrip de IngProd he probado también y más o menos igual, no funciona como espero.¿Hay que configurar algo para usar header? Porque a ver si me voy a estar comiendo la cabeza y el problema es que no lo tengo bien...

Muchas gracias de nuevo.
  #6 (permalink)  
Antiguo 13/03/2007, 12:50
 
Fecha de Ingreso: marzo-2007
Mensajes: 78
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Descargar archivos

Pues la verdad no sé... a mi ese script me funciona bien, y no tengo acceso al servidor, así que no he tocado nada...
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 16:22.