Descargar archivo a servidor y mostrar porcentage de progreso

  • Autor Autor andilien
  • Fecha de inicio Fecha de inicio
A

andilien

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola a todos, estoy haciendo una aplicación web y necesito saber cómo descargar un archivo remoto al servidor web, y mostrar al usuario el porcentage descargado asi como el tamaño descargado y el tamaño total, ¿alguien sabría cómo hacerlo?
Gracias gente!
 
Yo tengo implementado este:
progressbar
Por seguridad tendrías que utilizar funciones como
Insertar CODE, HTML o PHP:
finfo_open(FILEINFO_MIME_TYPE);


Supongo archivo del cliente > servidor-
 
Última edición:
Yo tengo implementado este:
progressbar
Por seguridad tendrías que utilizar funciones como
Insertar CODE, HTML o PHP:
finfo_open(FILEINFO_MIME_TYPE);


Supongo archivo del cliente > servidor-
Gracias por la respuesta, pero a lo que me refería era a la hora de descargar el archivo al servidor, por ejemplo:

Hay un formluario con un campo de texto en el que tienes que poner el enlace a un archivo (http:://ejemplo.com/archivo.zip) y un botón para descargar, se descargaría al servidor y mientras se descarga mostraría una barra de progreso con el porcentage descargado asi como el tamaño descargado y el tamaño total.
 
Ok entiendo que un usuario pondrá un enlace en tu servidor, y tu servidor descargara el archivo del enlace en TU servidor.

A mi a primeras me parece que tendrías que descargarlo con la librería libcurl y para información de bytes subidos, velocidad etc, para luego calcular y mostrar porcentajes, usando AJAX claro, miraría curl_getinfo.


Aún así te escribo esto sin mirar ninguna información y sin haber probado nada.
A ver si a alguien por el foro te da mejor idea.

Saludos
 
Última edición:
Te he preparado este "script", espero que te sirva:
PHP:
<?php
ob_start();

echo '<pre>';
echo 'Iniciando descarga ...<br />';

ob_flush();
flush();

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://aperpen.com/file.zip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progreso');
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FILE, fopen('/downloads/file.zip', 'w+'));
$html = curl_exec($ch);
curl_close($ch);


$tamano_total = 0;
function progreso($curl, $tamano, $descargado, $upload_size, $uploaded)
{
    global $tamano_total;
    if(reduceoutput(300))
        return;
    
    if($tamano_total > 0){
         echo 'Descargado: ',$descargado/1000,'KB de ',$tamano_total, 'KB (',round($descargado * 100/$tamano,2),'%) Velocidad: '.velocidad($descargado/1000).'<br />';
    sleep(0.5);
    }
    else
        $tamano_total = round($tamano/1000, 2);
    
    ob_flush();
    flush();
}

/* FUNCION PARA REDUCIR LA CANTIDAD DE INFORMACION MOSTRADA */
$i = 0;
function reduceoutput($r){
    global $i;
     if($i < $r){
        $i = $i+1;
        return true;
    }
    
    if($i == $r)
        $i = 0; 
    return false;
}


/** LAST DOWNLOADED */
$lastdownloaded;
$lasttime;
function velocidad($downloaded_total){
    global $lastdownloaded, $lasttime;
    if(empty($lastdownloaded) || empty($lasttime)){
        $lasttime = microtime(true);
        $lastdownloaded = $downloaded_total;
        return;
    }else{
        $time = microtime(true);
        $downloaded = $downloaded_total-$lastdownloaded;
        $spenttime = round(($time-$lasttime), 5);
        $lasttime = $time;
        $lastdownloaded = $downloaded_total;
        $speed = $downloaded/$spenttime;
        return round($speed/1000, 2).'MB/s';
    }
    
}
echo 'Transferencia completada';
?>

Te explico, lo básico:
PHP:
curl_setopt($ch, CURLOPT_URL, 'http://aperpen.com/file.zip');

Ahí debes cambiar lo que dice: http:// aperpen.com/file.zip por el archivo a descargar.

PHP:
curl_setopt($ch, CURLOPT_FILE, fopen('/downloads/file.zip', 'w+'));
Ahí cambias /downloads/file.zip por la ruta donde quieres guardar el archivo.

PHP:
if(reduceoutput(300))
Esa linea simplemente es para reducir el numero de mensajes mostrado. Si crees que se muestra muy poca información del progreso o demasiada puedes reducir o aumentar ese 300