Foros del Web » Programando para Internet » PHP »

Problema con links para descargar archivos del servidor

Estas en el tema de Problema con links para descargar archivos del servidor en el foro de PHP en Foros del Web. Buenas. Hace unos días pregunté esto: http://www.forosdelweb.com/f18/creac...vidor-1086971/ Y todo funcionaba bien, comprobé que los archivos se descargaban pero no los abrí. Abrí un pdf ayer ...
  #1 (permalink)  
Antiguo 07/01/2014, 06:39
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Problema con links para descargar archivos del servidor

Buenas. Hace unos días pregunté esto:

http://www.forosdelweb.com/f18/creac...vidor-1086971/

Y todo funcionaba bien, comprobé que los archivos se descargaban pero no los abrí. Abrí un pdf ayer por casualidad y da error "debido a que no es un tipo de archivo admitido o está dañado".

He comprobado que el archivo se sube correctamente al servidor, se abre correctamente. Pero descargarlo como expongo a continuación, no.

Explico lo que hice a ver si alguien me puede decir donde está el error. Cuando genero el link de descarga, encripto la ruta completa (directorio+nombre de archivo) dos veces, la primera con una función propia (encriptar) y la segunda, sobre esa encriptación, con base64.

Código PHP:
Ver original
  1. $ruta_completa_cript = encriptar ($ruta_completa);
  2. $ruta_completa_64 = base64_encode($ruta_completa_cript);

Muestro el link:

Código HTML:
Ver original
  1. <a class="archivo" href="descargas.php?id=<?php echo $ruta_completa_64; ?>"><?php echo $nombre_archivo; ?></a>

Y descargas.php es esto:

Código PHP:
Ver original
  1. require_once 'funciones.php';
  2.  
  3. $ruta_decodif = base64_decode($_GET['id']);
  4. $ruta_decodif_decript = desEncriptar($ruta_decodif);
  5.  
  6. header("Content-type: application/octet-stream");
  7. header("Content-Disposition: attachment; filename=\"$ruta_decodif_decript\"\n");
  8.    
  9. $fp=fopen($ruta_decodif_decript, "r");
  10. fpassthru($fp);

He comprobado que la versión original de la ruta ($ruta_completa) y la desencriptada en descargas.php son idénticas ($ruta_decodif_decript), por lo que no sé qué está fallando.
  #2 (permalink)  
Antiguo 07/01/2014, 10:33
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 9 meses
Puntos: 27
Respuesta: Problema con links para descargar archivos del servidor

Que error te exactamente?
Probaste esto ?
Código PHP:

    session_start
();
    require_once 
'funciones.php';
     
    
$ruta_decodif base64_decode($_GET['id']);
    
$ruta_decodif_decript desEncriptar($ruta_decodif);
     
    
header("Content-type: application/octet-stream");
    
header("Content-Disposition: attachment; filename=$ruta_decodif_decript");
   exit();    
/*
    $fp=fopen($ruta_decodif_decript, "r");
    fpassthru($fp);
*/ 
  #3 (permalink)  
Antiguo 07/01/2014, 11:50
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

aqui esta el error
Código PHP:
header("Content-type: application/octet-stream"); 
hay otras opciones para header
Código PHP:
header("Content-Length: " filesize($filename));
header("Content-Disposition: attachment; filename=$filename"); // con esto forsamos la descarga
header('Content-Transfer-Encoding: binary'); 
y para decirle el tipode archivo puede usar esto
Código PHP:
function get_mime($file) {
  if (
function_exists("finfo_file")) {
    
$finfo finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    
$mime finfo_file($finfo$file);
    
finfo_close($finfo);
    return 
$mime;
  } else if (
function_exists("mime_content_type")) {
    return 
mime_content_type($file);
  } else if (!
stristr(ini_get("disable_functions"), "shell_exec")) {
    
// http://stackoverflow.com/a/134930/1593459
    
$file escapeshellarg($file);
    
$mime shell_exec("file -bi " $file);
    return 
$mime;
  } else {
    return 
false;
  }
}
 
header("Content-type: get_mime($filename)"); 
  #4 (permalink)  
Antiguo 07/01/2014, 11:52
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Sí, lo probé, y el archivo se descarga, pero no se visualiza. Lo que se descarga es un archivo vacío, 0 KB.
  #5 (permalink)  
Antiguo 07/01/2014, 11:55
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

Cita:
Iniciado por luis010182 Ver Mensaje
Que error te exactamente?
Probaste esto ?
Código PHP:

    session_start
();
    require_once 
'funciones.php';
     
    
$ruta_decodif base64_decode($_GET['id']);
    
$ruta_decodif_decript desEncriptar($ruta_decodif);
     
    
header("Content-type: application/octet-stream");
    
header("Content-Disposition: attachment; filename=$ruta_decodif_decript");
   exit();    
/*
    $fp=fopen($ruta_decodif_decript, "r");
    fpassthru($fp);
*/ 


Cita:
Iniciado por DandyCC Ver Mensaje
Sí, lo probé, y el archivo se descarga, pero no se visualiza. Lo que se descarga es un archivo vacío, 0 KB.
es obio que va vacio no!!
comentaste el archivo esta claro que descargara algo vacio.
  #6 (permalink)  
Antiguo 07/01/2014, 12:00
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Me refería a que siempre se descarga un archivo vacío, no sólo comentando esas dos ultimas lineas.

No acabo de entender qué es lo que tengo que poner en el código. ¿Podrías explicarlo un poco más detalladamente?

Gracias
  #7 (permalink)  
Antiguo 07/01/2014, 12:56
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

del manual de php
Código PHP:
<?php

// abre el archivo en modo binario
$nombre './img/ok.png';
$fp fopen($nombre'rb');

// envía las cabeceras correctas
header("Content-Type: image/png");
header("Content-Length: " filesize($nombre));

// vuelca la imagen y detiene el script
fpassthru($fp);
exit;

?>
tu problema es que no esta leyendo el archivo


que pasa con esto?
Código PHP:
    session_start();
    require_once 
'funciones.php';
     
    
$ruta_decodif base64_decode($_GET['id']);
    
$ruta_decodif_decript desEncriptar($ruta_decodif);
echo  
$ruta_decodif_decript
  
/*   
  header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$ruta_decodif_decript");
*/

    
$fp=fopen($ruta_decodif_decript"r");
    
fpassthru($fp); 
esto deberia mostrar la ruta y el archivo
  #8 (permalink)  
Antiguo 07/01/2014, 14:10
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Gracias por contestar. Si pongo esto

Código PHP:
Ver original
  1. require_once 'funciones.php';
  2.    
  3. $ruta_decodif = base64_decode($_GET['id']);
  4. $ruta_decodif_decript = desEncriptar($ruta_decodif);
  5. echo $ruta_decodif_decript;

Lo que se muestra es el directorio y el nombre correctamente.

Código salida:
Ver original
  1. archivos/usuarios/PHP - Consejos de seguridad.pdf
  #9 (permalink)  
Antiguo 07/01/2014, 14:18
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

usa esto
Código PHP:
session_start();
    require_once 
'funciones.php';
     
    
$ruta_decodif base64_decode($_GET['id']);
    
$ruta_decodif_decript desEncriptar($ruta_decodif);
    
$ruta_decodif_decript=dirname(__FILE__)."/".$ruta_decodif_decript
   
  
header("Content-type: application/octet-stream");
    
header("Content-Disposition: attachment; filename=$ruta_decodif_decript");


    
$fp=fopen($ruta_decodif_decript"r");
    
fpassthru($fp); 
http://cl1.php.net/manual/es/function.dirname.php
usando dirname(__FILE__) le das una ruta absoluta
  #10 (permalink)  
Antiguo 07/01/2014, 15:01
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Pues sigue sin funcionar. Saca un archivo raro. Poniendo un echo a $ruta_decodif_decript, obtengo esto:

Código Salida:
Ver original
  1. C:\wamp\www\desarrollo\private/archivos/usuarios/PHP - Consejos de seguridad.pdf

Estoy usando wamp para el desarrollo, puede ser que por usar un servidor local la ruta salga así y no funcione?
  #11 (permalink)  
Antiguo 08/01/2014, 05:52
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

estas usando windows y en windows no se usa "/" se usa "\" por eso no encuentra el archivo
otro consejo es reemplazar los espacios y caracteres raros por _ al momento de hacer el update para evitar rutas erradas.
  #12 (permalink)  
Antiguo 09/01/2014, 05:20
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Siento la tardanza en responder, estoy muy liado estos días. Ya he conseguido que funcione con los cambios que me dijiste y un error absurdo que se me pasó. Muchísimas gracias!!!

Para acabar, tengo una pequeña duda que seguro que me podrás resolver fácilmente. Todo esto lo estoy haciendo porque en la web que estoy desarrollando cada usuario podrá subir archivos y compartirlos. Supongo que la mejor opción es crear una carpeta en el servidor para cada usuario, ¿no? ¿Sabes si hay algún límite de carpetas que se pueden crear en un servidor? ¿O si computacionalmente no interesa que haya tantas carpetas? Quisiera hacerlo así, pero no quiero encontrarme con ese problema cuando contrate el hosting.

Muchas gracias de nuevo!
  #13 (permalink)  
Antiguo 09/01/2014, 16:32
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con links para descargar archivos del servidor

bueno, limite no creo que alla.
pero si es asi lo que vas a hacer es mas facil tirar todo en una sola carpeta.
guardar los nombres cuando hacen un upload en la base junto al id del usuario y un nombre generico que crearas.
ejemplo
subo el archivo "cosas.doc" lo dejo en la carpeta archivos on el nombre "cosas654654.doc" y cuando alguien lo solicite le descargo con php poniendole el nombre "cosas.doc" y lo dejo descargar asi siempre sabre por la base que es que y no me renredo buscando archivos entre carpetas

y sirve para no tener ollos de seguridad, haciendo la carpeta de archivos inaccesible via web y haciendo que cada descarga sea atraves de php http://ecapy.com/como-forzar-la-desc...chivo-con-php/
  #14 (permalink)  
Antiguo 09/01/2014, 17:23
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Problema con links para descargar archivos del servidor

Vaya!! Fantástico aporte. Muchas gracias!! Ese link que has puesto va directo a favoritos!

Y ahora que lo mencionas, ¿cómo se puede hacer una ruta inaccesible via web?

Etiquetas: links, servidor
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 12:58.