FTP загрузка через cURL

Создано: Март 6, 2014

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


Настройки PHP, по умолчанию, позволяют загружать файты не более 2 Мб, если вам необходимо загружать большие файлы, то необходимо внести изменения в конфигурацию PHP, либо можно создать файл .htaccess в том же каталоге где и скрипт загрузки, со следующим содержанием:

php_value upload_max_filesize 16M 
php_value post_max_size 20M

Значение для post_max_size больше, чем значение для upload_max_size потому что мы хотим иметь возможность загружать больше, чем просто файл (данные формы, текстовых полей и т.д.).

Использование cURL для передачи файла

cURL является отличной библиотекой для передачи файлов через различные типы протоколов. Библиотека поддерживает передачу через POST, GET, FTP и многое другое. cURL также имеет возможность проверить аутентификацию пользователя на удаленном сервере или сайте.
В данной статье мы хотим загрузить файл на некоторый (защищенный паролем) удаленный FTP-сервер с помощью веб-формы.

<form action="curlupload.php" method="post" enctype="multipart/form-data">
<div>
<label for="upload">Select file</label>
<input name="upload" type="file" />
<input type="submit" name="Submit" value="Загрузить" />
</div>
</form>

Форма проста и имеет только одно поле для открытия файла и кнопку отправки.

Далее нам нужен некоторый PHP код для обработки загрузки файла и открытия потока для передачи файла с помощью cURL на удаленный FTP сервер (разместите этот код выше HTML кода с формой):

if (isset($_POST['Submit'])) {
 if (!empty($_FILES['upload']['name'])) {
 	$ch = curl_init();
 	$localfile = $_FILES['upload']['tmp_name'];
 	$fp = fopen($localfile, 'r');
 	curl_setopt($ch, CURLOPT_URL, 'ftp://ftp_user:password@ftp.example.ru/'.$_FILES['upload']['name']);
 	curl_setopt($ch, CURLOPT_UPLOAD, 1);
 	curl_setopt($ch, CURLOPT_INFILE, $fp);
 	curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
 	curl_exec ($ch);
 	$error_no = curl_errno($ch);
 	curl_close ($ch);
        if ($error_no == 0) {
        	$error = 'Файл успешно загружен.';
        } else {
        	$error = 'Ошибка загрузки файла.';
        }
 } else {
    	$error = 'Пожалуйста, выберите файл.';
 }
}

После того как пользователь выбрал файл, данные загружены на веб-сервер. Мы открываем временный файл при помощи fopen и инициализируем сессию cURL. Вместе с адресом удаленного FTP сервера, мы посылаем логин FTP и пароль. Остальные настройки cURL необходимы для отправки файла по протоколу FTP на удаленный сервер. Если код ошибки равен "0", то загрузка была успешной.

Это небольшой PHP пример отвечющий за загрузку файла на некоторый удаленный FTP-сервер. В реалии же здесь необходимо организовать различные процедуры проверки и валидации. Удачи!