Открыть файл через 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
не работает, извини. Но, как вы видите в моем коде, вам все равно это не нужно.