[Php-avanzado] Script para bajar un archivo

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Sab Dic 5 18:33:20 ART 2015


Gracias por lo de gente!

	si el software funciona bien en un equipo y mal en otro, el problema
está en el cliente.

	Sin poder debuguear con ese cliente en que falla y sin un mensaje de
error o algo, no hay mucho que aportar...

	Podés probar comentar la línea 13 para que el script muestre mensaje de
error y noticias, a ver si ves algo.

	También podés ver en la consola de errores del navegador si no hay
algún JS o algo interfiriendo.

	También podés probar en la PC que falla usarlo con otro navegador... no
lo comentás pero la cosa huele a Internet Exploter o a un browser  viejo
"del tiempo en que no existía Facebook".

	Buena caza!


El sáb, 05-12-2015 a las 16:39 -0300, Mario Gomez Cassou escribió:
> Hola gente:
> 
> 
> en un sistema genero un archivo al que el usuario debe poder bajar a
> su compu ("datos.csv")
> 
> Para esto utilizo un script que baje de 
> http://www.media-division.com/php-download-script-with-resume-option
> 
> Esta muy piola: pego el contenido debajo del mensaje 
> 
> El script se llama "bajar.php" y lo llamo con
> <a href="bajar.php?file=bajar/datos.csv" class = "boton2">Bajar el
> archivo</a>
> 
> 
> El problema es que funciona perfecto en mi compu y en un sitio, pero
> en otro, en lugar de inciar la descarga al tocar el link pone la
> pantalla en blanco y ahi queda.
> 
> Hoy estuve nuevamente mirando el codigo y no me doy cuenta donde esta
> el problema.
> 
> Lo gracioso es que para seguir adelante en mi página le puse
> directamente un link al archivo y al tocarlo el navegador inicia la
> descarga...
> 
> Como sea, si a algún Leo se le ocurre que cambiar se agradece el
> comentario
> 
> Gracias
> 
> Mario
> 
> 
> (bajar.php)
> ------------------------------------------------------------------------------------------
> /**
>  * Copyright 2012 Armand Niculescu - media-division.com
>  * Redistribution and use in source and binary forms, with or without
> modification, are permitted provided that the following conditions are
> met:
>  * 1. Redistributions of source code must retain the above copyright
> notice, this list of conditions and the following disclaimer.
>  * 2. Redistributions in binary form must reproduce the above
> copyright notice, this list of conditions and the following disclaimer
> in the documentation and/or other materials provided with the
> distribution.
>  * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY
> EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR
> CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
> EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  */
> // get the file request, throw error if nothing supplied
>  
> // hide notices
> @ini_set('error_reporting', E_ALL);
>  
> //- turn off compression on the server
> @apache_setenv('no-gzip', 1);
> @ini_set('zlib.output_compression', 'Off');
> 
> if(!isset($_REQUEST['file']) || empty($_REQUEST['file'])) 
> {
>     header("HTTP/1.0 400 Bad Request");
>     exit;
> }
> 
> // sanitize the file request, keep just the name and extension
> // also, replaces the file location with a preset one ('./myfiles/' in
> this example)
> $file_path  = $_REQUEST['file'];
> $path_parts = pathinfo($file_path);
> $file_name  = $path_parts['basename'];
> $file_ext   = $path_parts['extension'];
> $file_path  = './bajar/' . $file_name;
>  
>  
> // allow a file to be streamed instead of sent as an attachment
> $is_attachment = isset($_REQUEST['stream']) ? false : true;
>  
> // make sure the file exists
> if (is_file($file_path))
> {
>     $file_size  = filesize($file_path);
>     $file = @fopen($file_path,"rb");
>     if ($file)
>     {
>         // set the headers, prevent caching
>         header("Pragma: public");
>         header("Expires: -1");
>         header("Cache-Control: public, must-revalidate, post-check=0,
> pre-check=0");
>         header("Content-Disposition: attachment; filename=\"$file_name
> \"");
>  
>         // set appropriate headers for attachment or streamed file
>         if ($is_attachment)
>                 header("Content-Disposition: attachment; filename=
> \"$file_name\"");
>         else
>                 header('Content-Disposition: inline;');
>  
>         // set the mime type based on extension, add yours if needed.
>         $ctype_default = "application/octet-stream";
>         $content_types = array(
>                 "exe" => "application/octet-stream",
>                 "zip" => "application/zip",
>                 "mp3" => "audio/mpeg",
>                 "mpg" => "video/mpeg",
>                 "avi" => "video/x-msvideo",
>         );
>         $ctype = isset($content_types[$file_ext]) ?
> $content_types[$file_ext] : $ctype_default;
>         header("Content-Type: " . $ctype);
>  
>         //check if http_range is sent by browser (or download manager)
>         if(isset($_SERVER['HTTP_RANGE']))
>         {
>             list($size_unit, $range_orig) = explode('=',
> $_SERVER['HTTP_RANGE'], 2);
>             if ($size_unit == 'bytes')
>             {
>                 //multiple ranges could be specified at the same time,
> but for simplicity only serve the first range
> 
>     //http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt
>                 list($range, $extra_ranges) = explode(',',
> $range_orig, 2);
>             }
>             else
>             {
>                 $range = '';
>                 header('HTTP/1.1 416 Requested Range Not
> Satisfiable');
>                 exit;
>             }
>         }
>         else
>         {
>             $range = '';
>         }
>  
>         //figure out download piece from range (if set)
>         list($seek_start, $seek_end) = explode('-', $range, 2);
>  
>         //set start and end based on range (if set), else set defaults
>         //also check for invalid ranges.
>         $seek_end   = (empty($seek_end)) ? ($file_size - 1) :
> min(abs(intval($seek_end)),($file_size - 1));
>         $seek_start = (empty($seek_start) || $seek_end <
> abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0);
>  
>         //Only send partial content header if downloading a piece of
> the file (IE workaround)
>         if ($seek_start > 0 || $seek_end < ($file_size - 1))
>         {
>             header('HTTP/1.1 206 Partial Content');
>             header('Content-Range: bytes
> '.$seek_start.'-'.$seek_end.'/'.$file_size);
>             header('Content-Length: '.($seek_end - $seek_start + 1));
>         }
>         else
>           header("Content-Length: $file_size");
>  
>         header('Accept-Ranges: bytes');
>  
>         set_time_limit(0);
>         fseek($file, $seek_start);
>  
>         while(!feof($file)) 
>         {
>             print(@fread($file, 1024*8));
>             ob_flush();
>             flush();
>             if (connection_status()!=0) 
>             {
>                 @fclose($file);
>                 exit;
>             }            
>         }
>  
>         // file save was a success
>         @fclose($file);
>         exit;
>     }
>     else 
>     {
>         // file couldn't be opened
>         header("HTTP/1.0 500 Internal Server Error");
>         exit;
>     }
> }
> else
> {
>     // file does not exist
>     header("HTTP/1.0 404 Not Found");
>     exit;
> }
> ?>
> 
> _______________________________________________
> Lista de correo: Php-avanzado
> Mensajes a la lista: Php-avanzado en pato2.fi.mdp.edu.ar
> Administración Web: http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
> Desubscripción: php-avanzado-request en pato2.fi.mdp.edu.ar?subject=unsubscribe

-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado