PHP: скачать любой файл с ftp-сервера на жесткий диск? - PullRequest
0 голосов
/ 19 июля 2010

Мне действительно нужна твоя помощь.Я успешно устанавливаю соединение с моим сервером ftp.Однако я не могу понять, как я могу загрузить динамический файл с моего сервера.Я думаю, что это помогло бы многим другим людям, потому что я не мог найти учебник или объяснение где-либо в сети.

Я просто перечисляю все свои файлы на своем ftp.Если я нажимаю на один, я вызываю download.php, который снова подключается к серверу и должен загрузить файл на мой жесткий диск.Мне удалось автоматически запросить окно загрузки, и файл был загружен на мой жесткий диск.однако только поврежденный файл, в котором не установлены заголовки.

/* path to files on ftp server … e.g. /folder/folder/name_of_file.jpg */
$p_arr = explode("/", $path);
/* the file name … e.g name_of_file.jpg */
$file = end($p_arr);

//$finfo = finfo_open(FILEINFO_MIME_TYPE); //returns a fatal error - function not found 
//$mimetype = finfo_file($finfo, $file);
//finfo_close($finfo);

//filetype($file)

/* creating a temporyry file to save to */
$tempFile = tempnam("/tmp", "FOO");

if(ftp_get($conn_id, $tempFile, $file, FTP_BINARY)){ 
    /*header Content-type: must be dynamic*/
    //header('Content-type:' . $mimetype);

    /*header to auto_prompt download window*/
    header('Content-Disposition: attachment; filename="'. $file .'"');
    readfile($tempFile);
} else { 
    echo "There was a problem <br>";
    echo $file . "<br>"; //e.g. image.jpg
}

/* deleting the file after the process */
//unlink($tempFile);

1.) Я не могу понять, почему ftp_get возвращает false.Соединение устанавливается, и файл существует в правильном каталоге.2.) Я не знаю, как я могу узнать mimetype файла на сервере и дать ему загруженный файл, чтобы он не был поврежден.

, пожалуйста, помогите мне здесь, я действительно застрял,заранее спасибо

Ответы [ 3 ]

4 голосов
/ 19 июля 2010

Попробуйте сначала сохранить его локально, а затем отправить его обратно в браузер.

Используйте этот код для локального сохранения файла.

<?php
                // define some variables
        $folder_path = "YOUR FOLDER PATH";
        $local_file = "LOCAL FILE PATH";
        $server_file = "SERVER FILE PATH";

        //-- Connection Settings
        $ftp_server = "IP ADDRESS"; // Address of FTP server.
        $ftp_user_name = "USERNAME"; // Username
        $ftp_user_pass = "PASSWORD"; // Password
        #$destination_file = "FILEPATH";

        // set up basic connection
        $conn_id = ftp_connect($ftp_server);

        // login with username and password
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

        // try to download $server_file and save to $local_file
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
            echo "Successfully written to $local_file\n";
        } else {
            echo "There was a problem\n";
        }

        // close the connection
        ftp_close($conn_id);
?>

Я также нашел это, может быть, это может помочь вам

Мой FTP-сервер всегда отвечал "bool (false)" вместо того, чтобы представлять меня каталог-листинг. Я должен был добавить ftp_pasv ($ conn_id, true); сразу после $ login_result = ftp_login (...); линия. После этого все работало нормально.

0 голосов
/ 31 января 2013

Это работает для меня:

$fname = "file.xxx";

$conn = ftp_connect(FTP_URL);
if(ftp_login($conn, FTP_USER, FTP_PWD))
{
    if(ftp_chdir($conn, FTP_DIR))
    {
        $th = fopen('php://temp', 'r+');
        if(ftp_fget($conn, $th, $fname, FTP_ASCII, 0))
        {
            rewind($th);
            $data = stream_get_contents($th);
        }
    }
}

header("Content-Disposition: attachment; filename=$fname");
echo $data;

Таким образом, вам не нужно сначала сохранять файл локально

0 голосов
/ 19 июля 2010

tempnam ()

Когда я использовал tempnam(), он изменил расширение файла на .tmp.Это может вызвать проблемы, поэтому я не рекомендую делать это таким образом.По крайней мере, вы должны изменить расширение обратно на то, что было в исходном имени файла.

Вы можете добиться этого, используя pathinfo() в сочетании с regexp и rename(), после , когда вы загрузили файл ftp.

mimetype

Относительно mimetype: эта информация вам нужна только в том случае, если выхотите, чтобы браузер отображал файл, который вы отправляете пользователю.Для загрузки браузер должен знать только, что это двоичный файл, а браузер или пользователь может угадать по расширению.

Если вы все еще хотите проверить mimetype, вам придется подождать, пока файл не будетна вашем сервере, поэтому код проверки MIME будет находиться внутри блока if(ftp_get()).

ftp

Вы не показали свой код подключения (так я предполагаю), но выпонадобится полный путь для файла, который вы извлекаете с FTP.Если шаг ftp_get() не выполняется, вы, вероятно, запрашиваете неверный файл.

В противном случае вам потребуется ftp_chdir() после подключения и входа в систему.так что вы находитесь в правильной удаленной папке.

код

Этот код работал для меня:

<?php
$ftp = ftp_connect('server');
ftp_login($ftp, 'username', 'password');
$file = '/media.banzaimonkey.net/images/forums/boasas_banner_07.gif';

$tempFile = tempnam("/tmp", "FOO");

if(ftp_get($ftp, $tempFile, $file, FTP_BINARY)){
    echo 'success!';
} else {
    echo 'ffffail';
}
?>

Если этот код не работает для вас, вы можетевозникли проблемы с разрешениями, конфигурацией или другими проблемами, связанными со средой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...