Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] problema con forzar descarga de archivos

Estas en el tema de problema con forzar descarga de archivos en el foro de PHP en Foros del Web. Buena tarde foreros, tengo un detalle con la descarga de un archivo desde un script en php, el proceso de descarga si se lleva a ...
  #1 (permalink)  
Antiguo 23/04/2013, 12:16
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
problema con forzar descarga de archivos

Buena tarde foreros, tengo un detalle con la descarga de un archivo desde un script en php, el proceso de descarga si se lleva a cabo pero cuando quiro abrirr el archivo me manda el siguiente error:

"No se puede abrir el archivo debido a que no es un tipo de archivo admitido o esta dañado", sucede con todos los archivos. pdf, doc, xls

mi codigo es el siguiente:

Código PHP:
    $archivo_d1 =  basename($archivo_d);
    
header ("Content-Disposition: attachment; filename=".$archivo_d1."\n\n");
    
header ("Content-Type: application/octet-stream");
    
header ("Content-Length: ".filesize($archivo_d1));
    
readfile($archivo_d1); 

Última edición por Bernoo; 23/04/2013 a las 12:23
  #2 (permalink)  
Antiguo 23/04/2013, 12:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con forzar descarga de archivos

¿Ese es todo el código?

Muestra todo el código, porque es posible que algún espacio antes o después corrompa el archivo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 23/04/2013, 12:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Ese es todo el código?

Muestra todo el código, porque es posible que algún espacio antes o después corrompa el archivo.

Es este;
Código PHP:
session_start(); 
include_once(
'permisos.php');
include(
'cas_conexion.php');
$extensiones = array("jpg""jpeg""doc""pdf""xls","docx""xlsx"); // se restringe para que solo ciertas extensiones se puedan descargar
$archivo_d $_GET['archivo'];

    if(
strpos($archivo_d,"/")!==false){
     die(
"No puedes navegar por otros directorios"."<br>"."<a href='bajar_archivos.php'>Regresar</a>");
     exit();
    }

    
$ftmp explode(".",$archivo_d);
    
$archivo_ext strtolower($ftmp[count($ftmp)-1]);

    if(!
in_array($archivo_ext,$extensiones)){
        die(
"<b>ERROR</b> No es posible descargar archivos con extensi&oacuten .$archivo_ext"."<br>"
            
"<a href='bajar_archivos.php'>Regresar</a>");
        exit();
    }
    
    
$archivo_d1 =  basename($archivo_d);
    
header ("Content-Disposition: attachment; filename=".$archivo_d1."");
    
header ("Content-Type: application/octet-stream");
    
header ("Content-Length: ".filesize($archivo_d1));
    
readfile($archivo_d1); 
  #4 (permalink)  
Antiguo 23/04/2013, 12:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con forzar descarga de archivos

Así es, es bastante probable que algún espacio dentro de los include que haces corrompa el archivo.

Como prueba descarga el archivo que quieras y abrelo usando el bloc de notas, debería tener pura basura binaria, pero sin espacios antes ni después del contenido binario.

Como regla si los scripts que incluyes tienen únicamente código PHP entonces deberías omitir el último ?> de cada archivo para evitar dichos problemas.

¿Todo en orden?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 23/04/2013, 12:46
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

Cita:
Iniciado por pateketrueke Ver Mensaje
Así es, es bastante probable que algún espacio dentro de los include que haces corrompa el archivo.

Como prueba descarga el archivo que quieras y abrelo usando el bloc de notas, debería tener pura basura binaria, pero sin espacios antes ni después del contenido binario.

Como regla si los scripts que incluyes tienen únicamente código PHP entonces deberías omitir el último ?> de cada archivo para evitar dichos problemas.

¿Todo en orden?
Probare... saludos
  #6 (permalink)  
Antiguo 23/04/2013, 15:39
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

Probe haciendo un codigo nuevo en base al que puse originalmente, para saber si era bronca de algun espacio que ocasione que los header no funcione de manera correcta pero el problema persiste, se descarga el archivo pero lo manda corrupto
  #7 (permalink)  
Antiguo 23/04/2013, 15:43
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con forzar descarga de archivos

La única forma de que el archivo se descargue corrupto es precisamente la que te he mencionado, algo se está imprimiendo de más en el archivo.

Intenta hacer un exit() después de leer el archivo, así evitas que el último salto de linea del script se imprima.

Eso y abre el archivo para que veas por ti mismo si hay otro salto de linea que no veas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 23/04/2013, 15:47
Avatar de softmaster  
Fecha de Ingreso: diciembre-2008
Mensajes: 230
Antigüedad: 15 años, 4 meses
Puntos: 12
Respuesta: problema con forzar descarga de archivos

verifica la firma unicode(DOM), a mi me paso una vez algo parecido, no tiene que estar
  #9 (permalink)  
Antiguo 23/04/2013, 16:32
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: problema con forzar descarga de archivos

También e posible que falle si está habilitada la compresión gzip. Yo tuve muchos dolores de cabeza por ello, así que para estos casos implementé

Código PHP:
Ver original
  1. ini_set('zlib.output_compression', 'Off');
  2. header("Content-length: " . filesize($file));
  3. header('Content-type: application/zip');
  4. header("Content-Disposition: attachment; filename=".str_replace(" ","",$file));
  5. header('Content-Transfer-Encoding: binary');
  6. readfile($file);
  7. exit();
  #10 (permalink)  
Antiguo 24/04/2013, 08:28
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

No se si tenga que ver que lo estoy haciendo desde un servidor local (appserv), ya ejecute un tercer script tolamente diferentes y sigue descargando los archivos corruptos.. no es nada normal
  #11 (permalink)  
Antiguo 24/04/2013, 09:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con forzar descarga de archivos

Crea un archivo de texto con algo sencillo, un "Hola mundo" por ejemplo.

Ahora trata de descargar el archivo que creaste con tu script, después puedes abrirlo y ver si tiene algo de más.

Es lo único que se me ocurre para poder ver, porque adivinar no se puede.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 25/04/2013, 09:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

El problema sigue, he minimizado mi codigo hasta lo siguiente:

Código PHP:
$path_origen ="/docs"//path
$dir=$_SERVER["DOCUMENT_ROOT"].$path_origen;
$directorio=opendir($dir);

while (
$archivo readdir($directorio)){
$archivo_d $archivo;
}
closedir($directorio);
$archivo_d1 basename($archivo_d);
header ('Content-Disposition: attachment;filename='.$archivo_d1);
header ('Content-Type: application/octet-stream');
readfile($archivo_d1);
exit(); 

abro el archivo con un bloc de notas y efectivamente me imprime:
Código HTML:
<br />
<b>Warning</b>:  readfile(hola.txt) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>C:\AppServ\www\Joomla1.5\c_cas\bajar_archivo_server.php</b> on line <b>13</b><br /> 
  #13 (permalink)  
Antiguo 25/04/2013, 09:47
pr0
 
Fecha de Ingreso: marzo-2004
Mensajes: 687
Antigüedad: 20 años, 1 mes
Puntos: 28
Respuesta: problema con forzar descarga de archivos

Te paso el método que hice para la descarga de ficheros. Me pasaba lo mismo que a tí y lo conseguí arreglar.

Al final el secreto estaba en usar ob_end_clean() en lugar de ob_clean()

Código PHP:
public function download(){

            
$file'./files/archivo.txt';
            
$filenamebasename($file);
            
$type '';
             
            if (
is_file($file)) {
                
$size filesize($file);
                if (
function_exists('mime_content_type')) {
                    
$type mime_content_type($file);
                } else if (
function_exists('finfo_file')) {
                    
$info finfo_open(FILEINFO_MIME);
                    
$type finfo_file($info$file);
                    
finfo_close($info);
                }
                if (
$type == '') {
                    
$type "application/force-download";
                }
                
// Set Headers
                
header("Content-Type: $type");
                
header("Content-Disposition: attachment; filename=$filename");
                
header("Content-Transfer-Encoding: binary");
                
header("Content-Length: " $size);
                
// Download File
                
ob_end_clean();
                
flush();
                
readfile($file);
            } else {
                echo 
$file.' no es un archivo.';
            }
        


Edito:

por lo que veo en tu último post, el error te indica claramente que no puede encontrar el archivo hola.txt, seguramente porque estás indicando mal la ruta.
  #14 (permalink)  
Antiguo 25/04/2013, 10:10
 
Fecha de Ingreso: noviembre-2008
Mensajes: 100
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: problema con forzar descarga de archivos

Gracias "pr0" funciono con la funcion de ob_end_clean();, habia usado ob_clean sin resultado positivo, quedo agradecido !

"reverencia" ...

Etiquetas: Ninguno
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 21:33.