Открыть файл через FTP URL

Я пытаюсь загрузить файл с помощью PHP с FTP-адреса, который выглядит как ftp://username:password@domain/file.zip, URL хороший, потому что я могу загрузить файл и вставить его в любой браузер. Fopen поддерживает этот вид потоковой передачи файлов, только что видел здесь: fopen. Вот мой код:

[...]
$destination_folder = '../importmlsupload/';    
$url = "ftp://user:password@domain/file.zip";
$newfname = $destination_folder . basename($url);
$file = fopen($url, "rb");
if ($file) {
    $newf = fopen($newfname, "wb");
    while(!feof($file)) {
        $s = fread($file, 1024);
        fwrite($newf, $s, 1024 );
    }
}

if (!empty($file)) {
    fclose($file);
}

if (!empty($newf)) {
    fclose($newf);
}

Проблема в том, что я получил загруженный файл. Я провел некоторые проверки и получил следующие результаты: файл успешно создан на сервере, но цикл while (! Feof(...)) заканчивается после первого шага. Таким образом, он читает 1024 байта и выходит из цикла. Другими словами, feof возвращает true после первых 1024 байтов или чтения.

РЕЗУЛЬТАТЫ ПО ИСПЫТАНИЮ С URL-адресом HTTP УСПЕШНЫЙ ИМПОРТ, НО FTP-УКАЗАНИЕ НЕ

Я делаю что-то неправильно?

2 ответа

Я не пробовал ваш код, но если у вас есть детали ftp, вы можете использовать вместо них функции FTP. Это может быть не тот ответ, который я знаю.:)

Привет Эрвин и извините за поздний ответ!

У меня была та же проблема, и я нашел два ответа. Сначала я попробовал file_get_contents, Это работает так:

$input = file_get_contents($url);
$writtenChars = file_put_contents($newfname, $input);

Очень просто и работает, но я думаю, только для ASCII и если у вас достаточно памяти, так как он читает весь файл перед записью. Мне понравился твой подход с буфером. Итак, я сделал следующее:

$source = fopen($url, 'r');
$destination = fopen($newfname, 'w+');
while($data = fread($source, 1024)) {
    fwrite($destination, $data);
}

Это прекрасно работает для файла XML, который я загружаю. Ваш двоичный файл должен быть в порядке, когда вы делаете 'wb' в параметре mode fopen,

Я не знаю почему твой feof не работает, извини. Но, как вы видите в моем коде, вам все равно это не нужно.

Другие вопросы по тегам