es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Desencadenando el sitio web de “guardar como”, la funcionalidad completa desde PHP.

Estoy utilizando el siguiente código para descargar una página web con éxito:

header('Content-Type: text/html');
header('Content-Disposition: attachment; filename="'.$title.'"'); // necesario para el cuadro de diálogo de descarga
print $content;

Sin embargo, obtengo una única página estática sin recursos de imágenes. Lo que esperaba era descargar la carpeta completa como lo haría si se utiliza la función guardar como de un navegador.

El código anterior dispara la ventana emergente que se muestra a continuación:
Introducir la descripción de la imagen aquí

He encontrado varios hilos que sugieren utilizar exec(wget url) pero descarga directorios enteros en mi estructura de archivos y causa mucha confusión al duplicar múltiples archivos. Curl tampoco dio los resultados deseados.

Con ambos wget y curl, ninguno de ellos presentó la ventana emergente que es esencial para que el usuario renombre la descarga como considere adecuado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para descargar una página web con todos sus recursos

    Para descargar una página web junto con todos sus recursos como imágenes, hojas de estilo, scripts, etc., puedes utilizar el siguiente enfoque:

    1. Utiliza la función file_get_contents() para obtener el contenido HTML de la página web.
    2. Utiliza un parser DOM como DOMDocument o simple_html_dom para analizar el HTML y extraer todas las URL de los recursos.
    3. Descarga cada recurso utilizando las funciones file_put_contents() o copy().
    4. Comprime todos los recursos descargados y envíalos como un archivo adjunto.

    Aquí hay un ejemplo de código que implementa el enfoque anterior:

    // URL de la página web a descargar
    $url = "http://example.com";
    
    // Obtiene el contenido HTML de la página web
    $html = file_get_contents($url);
    
    // Analiza el HTML para extraer las URL de los recursos
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $resources = array();
    foreach ($dom->getElementsByTagName('img') as $img) {
        $resources[] = $img->getAttribute('src');
    }
    foreach ($dom->getElementsByTagName('link') as $link) {
        if ($link->getAttribute('rel') == 'stylesheet') {
            $resources[] = $link->getAttribute('href');
        }
    }
    foreach ($dom->getElementsByTagName('script') as $script) {
        $resources[] = $script->getAttribute('src');
    }
    
    // Descarga cada recurso a un archivo local
    $downloaded_files = array();
    foreach ($resources as $resource) {
        $filename = basename($resource);
        $localfile = "downloads/$filename";
        copy($resource, $localfile);
        $downloaded_files[] = $localfile;
    }
    
    // Comprime todos los archivos descargados
    $zipname = 'downloads.zip';
    $zip = new ZipArchive();
    $zip->open($zipname, ZipArchive::CREATE);
    foreach ($downloaded_files as $file) {
        $zip->addFile($file, basename($file));
    }
    $zip->close();
    
    // Envía el archivo zip como un archivo adjunto
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
    header('Content-Length: ' . filesize($zipname));
    readfile($zipname);
    
    // Elimina los archivos y el zip descargados
    foreach ($downloaded_files as $file) {
        unlink($file);
    }
    unlink($zipname);
    

    Este código descarga todos los recursos de la página web y los comprime en un único archivo, que luego se envía como un archivo adjunto. El usuario puede guardar el archivo adjunto con cualquier nombre deseado.

Comments are closed.