[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