Как загрузить папку с веб-сервера на локальный компьютер с помощью php

Я могу заархивировать и загрузить папку с моего локального компьютера, используя следующий код. Но я хочу загрузить папку с моего веб-сервера. Как мне это сделать. пожалуйста помоги. Я много искал в Google, но не нашел решения.

$the_folder = 'C:/Program Files/Red5/webapps/SOSample/streams/';
$zip_file_name = 'getaaa.zip';


$download_file= true;
//$delete_file_after_download= true; doesnt work!!


class FlxZipArchive extends ZipArchive {

 // $location="http://localhost/SOSample";
 public function addDir($location, $name) {
    $this->addEmptyDir($name);

    $this->addDirDo($location, $name);
 } // EO addDir;


 private function addDirDo($location, $name) {
    $name .= '/';
    $location .= '/';

    // Read all Files in Dir
    $dir = opendir ($location);
    while ($file = readdir($dir))
    {
        if ($file == '.' || $file == '..') continue;
        // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
        $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
        $this->$do($location . $file, $name . $file);
    }
} // EO addDirDo();
}

$za = new FlxZipArchive;
$res = $za->open($zip_file_name, ZipArchive::CREATE);
if($res === TRUE) 
{
$za->addDir($the_folder, basename($the_folder));
$za->close();
}
else  { echo 'Could not create a zip archive';}

if ($download_file)
{
ob_get_clean();
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=" . basename($zip_file_name) . ";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($zip_file_name));
readfile($zip_file_name);

//deletes file when its done...
//if ($delete_file_after_download) 
//{ unlink($zip_file_name); }
}
?>

person Geethanjali    schedule 27.02.2014    source источник


Ответы (3)


Вы не можете «скачать папку». Вы должны застегнуть его.

person Alex Benoit    schedule 27.02.2014
comment
Если вы беспокоитесь о том, что у людей есть распаковщик, обратите внимание, что в настоящее время Windows может по умолчанию открывать файлы .zip. - person Alex Benoit; 27.02.2014
comment
Да, я хочу заархивировать папку и загрузить ее с помощью php. - person Geethanjali; 27.02.2014
comment
На самом деле моя концепция такова, что у меня есть сервер red5. Все записи от пользователя будут сохранены на сервере Red5 в папках с именами пользователей. Я хочу дать ссылку, по которой пользователь может скачать свои записи - person Geethanjali; 27.02.2014
comment
Я могу заархивировать и загрузить папку с моего локального компьютера, используя следующий код. Но я хочу загрузить папку с моего веб-сервера. Вы должны уточнить лучше. В своем посте вы начали с того, что уже смогли заархивировать папку и скачать ее. - person Alex Benoit; 27.02.2014
comment
stackoverflow.com/ вопросы/1334613/ - person Alex Benoit; 27.02.2014
comment
Да, я уже могу заархивировать и загрузить папку с моего локального компьютера, используя приведенный выше код. Я хочу заархивировать и загрузить папку с веб-сервера. - person Geethanjali; 27.02.2014
comment
Нет. Не работает. Помогите пожалуйста мне. Я пытаюсь найти решение за последний месяц. Я много гуглил, везде находил решение заархивировать и скачать папку с локальной машины. - person Geethanjali; 27.02.2014
comment
Если я изменю местоположение $ the_folder, т. Е. Исходное местоположение на мой веб-адрес, он загрузит пустую заархивированную папку с именем назначения. - person Geethanjali; 27.02.2014

Вместо указания $location="http://localhost/SOSample"; укажите полный абсолютный путь вашего веб-сервера, поместите его на свой веб-сервер, и он сделает zip-файл с вашего веб-сервера. Ваш сервер eb windows или linux на его основе дает путь к переменной $location.

person vinoth    schedule 27.02.2014
comment
Мой веб-сервер основан на Linux. $location комментируется. Фактическое местоположение указано в $the_folder. Я пытался указать полный путь, но он не работает. Он скачивает папку, но я не могу ее открыть. Пишет, что файлы повреждены или повреждены. - person Geethanjali; 27.02.2014

Как сказано, вы не можете скачать папку. Однако, если у вас есть путь к файлу, вы можете загружать файлы отдельно друг от друга. Использование file_get_contents упрощает задачу. http://nl1.php.net/file_get_contents

=============== Изменить: ===============

Вам нужно рекурсивно добавить файлы в каталог. Что-то вроде этого (не проверено):

function createZipFromDir($dir, $zip_file) {
    $zip = new ZipArchive;
    if (true !== $zip->open($zip_file, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)) {
        return false;
    }
    zipDir($dir, $zip);
    return $zip;
}

function zipDir($dir, $zip, $relative_path = DIRECTORY_SEPARATOR) {
    $dir = rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) {
            if (file === '.' || $file === '..') {
                continue;
            }
            if (is_file($dir . $file)) {
                $zip->addFile($dir . $file, $file);
            } elseif (is_dir($dir . $file)) {
                zipDir($dir . $file, $zip, $relative_path . $file);
            }
        }
    }
    closedir($handle);
}

Затем позвоните $zip = createZipFromDir('/tmp/dir', 'files.zip');

Некоторые примеры zip см.: http://www.php.net/manual/en/zip.examples.php (код из: Как заархивировать папку и загрузить ее с помощью php?)

=============== Редактировать 2: ===============

На основании вашего комментария:

opendir() используется для открытия локального каталога и, начиная с PHP 5.0.0, в каталоге ftp.

Если ваш PHP-код работает на www.domain.com, тогда /pages/to/path на самом деле является локальным каталогом, и вы можете сделать это:

$dir ='<wwwroot>/pages/to/path';
if ($handle = opendir($dir)) {

где wwwroot — это корень файловой системы, как видно из вашего php-кода.

Если вы пытаетесь загрузить контент с другого веб-сайта, попробуйте, например. файл_получить_содержимое(). Обратите внимание, что если удаленный сервер перечисляет содержимое каталога, этот список на самом деле представляет собой HTML-страницу, сгенерированную на лету сервером. Возможно, вам понадобится проанализировать эту страницу. Лучший подход — проверить, предлагает ли сервер какой-либо API, с помощью которого он отправляет контент в стандартизированной форме, например. в формате JSON.

person eL-Prova    schedule 27.02.2014
comment
У меня есть путь, но я хочу, чтобы папка была заархивирована, а затем загружена. - person Geethanjali; 27.02.2014
comment
@Geethanjali взгляните на мою правку. Если это поможет, пожалуйста, отметьте как ответ :) - person eL-Prova; 27.02.2014
comment
Извини. Он говорит, что не удалось открыть каталог: не реализовано ... в строке 15. Я дал полные права на исходную папку. Что еще может вызвать эту проблему? - person Geethanjali; 27.02.2014
comment
Да, я пытаюсь загрузить папку с другого веб-сайта. У меня есть веб-контент на одном сервере, а red5 установлен на другом сервере. Поэтому, когда пользователь записывает аудио/видео на моем веб-сервере, оно переходит на сервер red5 и сохраняется там, создавая отдельную папку для каждого пользователя. Теперь, когда учитель входит на веб-сервер, он должен иметь возможность загружать все записи учеников/пользователей одним нажатием кнопки. Это концепция. Помогите пожалуйста мне. Я также новичок в php. - person Geethanjali; 28.02.2014