|
|
XLVI. Функции для работы с FTPЭти функции всегда доступны.
Для использования FTP функций, вы должны указать директиву
--enable-ftp во время установки PHP 4 или
--with-ftp при использовании PHP 3.
Версия PHP для
Windows имеет встроенную поддержку данного расширения. Это означает, что
для использования данных функций не требуется загрузка никаких
дополнительных расширений. Данное расширение не определяет никакие директивы конфигурации в php.ini.
Перечисленные ниже константы определены данным расширением и могут быть
доступны только в том случае, если PHP был собран с
поддержкой этого расширения или же в том случае, если
данное расширение подгружается во время выполнения.
Следующие константы появились в PHP 4.3.0.
- FTP_AUTOSEEK
(integer)
Дополнительная информация доступна в описании функции
ftp_set_option().
- FTP_AUTORESUME
(integer)
Автоматически определять позицию в файле, с которой начинается
докачка при использовании команд GET и PUT (имеет смысл только
совместно с FTP_AUTOSEEK)
- FTP_FAILED
(integer)
Асинхронная операция завершилась неудачно
- FTP_FINISHED
(integer)
Асинхронная операция окончена
- FTP_MOREDATA
(integer)
Асинхронная операция еще не завершена
Пример 1. Пример использования функций FTP |
<?php
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if ((!$conn_id) || (!$login_result)) {
echo "Не удалось установить соединение с FTP сервером!";
echo "Попытка подключения к серверу $ftp_server под именем $ftp_user_name!";
exit;
} else {
echo "Установлено соединение с FTP сервером $ftp_server под именем $ftp_user_name";
}
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
if (!$upload) {
echo "Не удалось закачать файл!";
} else {
echo "Файл $source_file закачен на $ftp_server под именем $destination_file";
}
ftp_close($conn_id);
?>
|
|
- Содержание
- ftp_alloc -- Резервирует место на диске для закачиваемого файла
- ftp_cdup -- Переходит в родительскую директорию
- ftp_chdir -- Изменяет текущую директорию на FTP сервере
- ftp_chmod -- Устанавливает права доступа к файлу
- ftp_close -- Закрывает соединение с FTP сервером
- ftp_connect -- Устанавливает соединение с FTP сервером
- ftp_delete -- Удаляет файл на FTP сервере
- ftp_exec -- Выполняет программу на FTP сервере
- ftp_fget -- Загружает файл с FTP сервера и сохраняет его в предварительно открытом файле
- ftp_fput -- Загружает предварительно открытый файл на FTP сервер
- ftp_get_option -- Получает текущие параметры FTP соединения
- ftp_get -- Загружает файл с FTP сервера
- ftp_login -- Выполняет вход на FTP сервер
- ftp_mdtm -- Возвращает время последней модификации файла
- ftp_mkdir -- Создаёт директорию
- ftp_nb_continue -- Продолжает асинхронную операцию
- ftp_nb_fget -- Скачивает файл с FTP сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
- ftp_nb_fput -- Загружает предварительно открытый файл на FTP сервер в асинхронном режиме
- ftp_nb_get -- Скачивает файл с FTP сервера в асинхронном режиме и сохраняет его в локальный файл
- ftp_nb_put --
Загружает файл на FTP сервер в асинхронном режиме
- ftp_nlist -- Возвращает список файлов в заданной директории
- ftp_pasv -- Включает или выключает пассивный режим
- ftp_put -- Загружает файл на FTP сервер
- ftp_pwd -- Возвращает имя текущей директории
- ftp_quit -- Псевдоним функции ftp_close()
- ftp_raw -- Отправляет произвольную команду FTP серверу
- ftp_rawlist -- Возвращает список файлов в заданной директории
- ftp_rename -- Переименовывает файл на FTP сервере
- ftp_rmdir -- Удаляет директорию
- ftp_set_option -- Устанавливает параметры соединения с FTP сервером
- ftp_site -- Отправляет команду SITE серверу
- ftp_size -- Возвращает размер файла
- ftp_ssl_connect -- Устанавливает соединение с FTP сервером через SSL
- ftp_systype -- Возвращает тип операционной системы FTP сервера
add a note
User Contributed Notes
Функции для работы с FTP
dot a dot@dot dot com
17-Sep-2007 08:49
This took me a few hours to work out. It is based on the code below I've just added a string replace to convert pathname given by Windows to Unix pathname. Hope it saves somebody some time. Enjoy! (Also, delete file function is included:))
<?php
$myFile = $_FILES['file']; $file = $myFile['tmp_name']; $myFileName = $_POST['MyFile']; $myfile_replace = str_replace('\\', '/', $myFileName); $myfile = basename($myfile_replace); $destination_file = "/".$myfile; $ftp_server = "127.0.0.1"; $ftp_user_name = ""; $ftp_user_pass = ""; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h1>You do not have access to this ftp server!</h1>");
$upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY); if (!$upload) { echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
}
ftp_close($conn_id); }
?>
<form name="form" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" >
Please choose a file: <input type="file" name="file" accept="text/plain" onChange="MyFile.value=file.value">
<input name="MyFile" type="hidden" id="MyFile" tabindex="99" size="1" />
<input type="submit" name="submit" value="upload" style="vertical-align:middle"/><br/><br/>
</form>
chris at faktortel dot com dot au
08-Jul-2007 03:47
I had some major problems running ftp_connect from my Web Browser and not from the CLI from 1 server and yet from another Internal server I had no trouble at all. After a few hours I figured out this was because SELINUX was enabled on one server and DISABLED on the server that it worked on.
So in short, if you are having trouble with connecting in your Web Browser make sure you have HTTPD connect's enabled in it like so at the command prompt:
; Turns it on temporarily.
/usr/sbin/setsebool httpd_can_network_connect=1
; Turns it on Permenantly
/usr/sbin/setsebool -P httpd_can_network_connect=1
I hope this helps make someones life a little easier. :)
(I actually found this fix on the fopen manual page).
ras "at" fyn {dot} dk
26-Jan-2007 01:11
A function to get a remote file and return it's contents, instead of saving to a local file, was missing - here it is:
function ftp_fetch($ftp_stream, $remote_file) {
ob_end_flush();
ob_start();
$out = fopen('php://output', 'w');
if (!ftp_fget($ftp_stream, $out, $remote_file, FTP_ASCII)) die('Unable to get file: ' . $remote_file);
fclose($out);
$data = ob_get_clean();
return $data;
}
It works the same as ftp_get(), but instead returns the contents of the remote file - for example:
$ftp = ftp_connect('my.server.com', 21, 60);
ftp_login($ftp, 'username', 'password');
$data = ftp_fetch($ftp, 'path/to/remote.file');
echo $data;
Note, I use it to fetch text-files from a server - if you need to fetch binary files, change FTP_ASCII to FTP_BINARY .. but most likely, getting files to memory is only useful for smaller files, e.g. plain text, xml, etc.
breese at pipetech dot tv
29-Dec-2006 09:02
I fixed the below upload script to work with Windows uploads (and updated some of the syntax). I also added a Javascript "progress indicator" for those of us who don't use PHP 5.2
<?php
if(isset($_POST['start_upload']) && $_FILES['txt_file']['name'] != ""){
$local_file = $_FILES['txt_file']['tmp_name']; $destination_file = "/".basename($_FILES['txt_file']['name']); $ftp_server = "127.0.0.1"; $ftp_user_name = "username"; $ftp_user_pass = "password"; $conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed! <br />";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
exit;
} else {
echo "Connected to $ftp_server, for user $ftp_user_name <br />";
}
$upload = ftp_put($conn_id, $destination_file, $local_file, FTP_BINARY); if (!$upload) {
echo "<h2>FTP upload of ".$_FILES['txt_file']['name']." has failed!</h2><br /><br />";
} else {
echo "Success!<br />" . $_FILES['txt_file']['name'] . " has been uploaded to " . $ftp_server . $destination_file . "!<br /><br />";
}
ftp_close($conn_id); }
?>
<html>
<head>
<script type="text/javascript">
window.onload = function() {
document.getElementById("progress").style.visibility = "hidden";
document.getElementById("prog_text").style.visibility = "hidden";
}
function dispProgress() {
document.getElementById("progress").style.visibility = "visible";
document.getElementById("prog_text").style.visibility = "visible";
}
</script>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
Please choose a file: <input name="txt_file" type="file" size="35" />
<input type="submit" name="start_upload" value="Upload File" onClick="dispProgress()" />
</form>
<!-- Link to progress file: see http://www.ajaxload.info/ for animated gifs -->
<img id="progress" src="http://www.your.site/images/progress.gif" />
<p id="prog_text" style="display:inline;"> Upload Started!</p>
</body>
<html>
cgray at premierconsulting dot com (Chris Gray)
24-Oct-2006 08:58
After looking everywhere for a "FULLY WORKING" ftp uploader script, I finally came up with this, by using a lot of various one’s I found on the web. If you find a better way of doing something, please let me know. Thanks, and Enjoy
<?php
if(isset($_POST['SubmitFile'])){
$myFile = $_FILES['txt_file']; $file = $myFile['tmp_name']; $myFileName = basename($_POST['txt_fileName']); $destination_file = "/".$myFileName; $ftp_server = "127.0.0.1"; $ftp_user_name = "Your UserName"; $ftp_user_pass = "Your Password"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h2>You do not have access to this ftp server!</h2>"); if ((!$conn_id) || (!$login_result)) { echo "FTP connection has failed! <br />";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
exit;
} else {
}
$upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY); if (!$upload) { echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
} else {
echo "Uploading $myFileName Complete!<br /><br />";
}
ftp_close($conn_id); }
?>
<html>
<head>
</head>
<body>
<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
Please choose a file: <input name="txt_file" type="file" id="txt_file" tabindex="1" size="35" onChange="txt_fileName.value=txt_file.value" />
<input name="txt_fileName" type="hidden" id="txt_fileName" tabindex="99" size="1" />
<input type="submit" name="SubmitFile" value="Upload File" accesskey="ENTER" tabindex="2" />
</form>
</body>
<html>
nicklas at programmera dot nu
15-Aug-2006 02:56
I didn't quite like my FTP program since I had to make all the settings all over when i restarted the client, so I made this script for simple ftp uploading, its running as a CLI app.
<?php
if (!defined("STDIN"))
{
define("STDIN", fopen("php://stdin", "r"));
}
echo "FTP file uploader\r\n\r\n";
echo "Server: ";
$server = trim(fgets(STDIN));
echo "Username: ";
$username = trim(fgets(STDIN));
echo "Password: ";
$password = trim(fgets(STDIN));
$connect = ftp_connect($server);
$login = ftp_login($connect, $username, $password);
if ((!$connect) || (!$login))
{
exit("Login failed.\r\n");
}
echo "Connected\r\n";
echo "PASV (Y/Any key = Off): ";
if(trim(fgets(STDIN)) == "Y")
{
ftp_pasv($connect, true);
echo "PASV: On\r\n";
}
else
{
echo "PASV: Off\r\n";
}
$showContent = ftp_nlist($connect, "");
echo "Listing Contents:\r\n";
var_dump($showContent);
echo "File to upload: ";
$file = trim(fgets(STDIN));
if ($file == "exit;")
{
exit;
}
$upload = ftp_put($connect, $file, $file, FTP_ASCII);
if (!$upload)
{
exit("Upload failed.\r\n");
}
else
{
echo "The file \"" . $file . "\" was successfully uploaded. :)\r\nSize of \"" . $file . "\": " . filesize($file) / 1024 ."kb.\r\n";
echo "My work is done, bye.\r\n";
}
ftp_close($connect);
?>
magic2lantern at mail dot ru
23-Dec-2005 08:19
This is a simple script writen by me which allows the user
run it in console and get tree from FTP Server.
<?php
$argv = $_SERVER["argv"];
$argv = array_slice($argv,1);
if (getenv("HTTP_HOST")) {exit("For bash execution only!");}
if ((empty($argv[0])) || (empty($argv[1]))) {exit("Usage: thisscript.php 10.0.0.10 /games/Arcade/
where 10.0.0.10 is the FTP Server and /games/Arcade is the start path on FTP\n");}
$connect_id = ftp_connect($argv[0]);
if ($connect_id) { $login_result = ftp_login($connect_id, 'anonymous', 'JustForFun'); }
if ((!$connect_id) || (!$login_result)) {
echo "Unable to connect the remote FTP Server!\n";
exit;
}
function ftp_get_dir ($ftp_dir) {
global $connect_id;
$ftp_contents = ftp_nlist ($connect_id, $ftp_dir);
for ($myCounter_for_server_elements = 0; !empty ($ftp_contents[$myCounter_for_server_elements]);
$myCounter_for_server_elements++)
{
echo $argv[0] . $ftp_dir . $ftp_contents[$myCounter_for_server_elements] . "\n";
ftp_get_dir ($ftp_dir . $ftp_contents[$myCounter_for_server_elements] . '/');
}
}
ftp_get_dir ($argv[1]);
ftp_close($connect_id);
?>
dickiedyce at uk dot com
07-May-2005 08:20
It may seem obvious to others, but it had me stumped for nearly an hour! If you can connect to an ftp site but some functions (list, put, get etc) don't work, then try using ftp_pasv and set passive mode on.
<?php
$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv ( $conn_id, true );
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!";
echo "Attempted to connect to $host for user $ftp_user_name";
die;
} else {
echo "Connected to $host, for user $ftp_user_name<br>";
echo "Host IP is $hostip<br>";
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
echo "successfully uploaded $file<br>";
} else {
echo "There was a problem while uploading $file<br>";
}
ftp_close($conn_id);
}
?>
arjen at queek dot nl
15-Jul-2004 07:38
If you prefer a OO-approach to the FTP-functions, you can use this snippet of code (PHP5 only! and does add some overhead). It's just a "start-up", extend/improve as you wish...
You can pass all ftp_* functions to your object and stripping ftp_ of the function name. Plus, you don't have to pass the ftp-resource as the first argument.
For example:
<?php
ftp_delete($ftp, $file); ?>
Can become:
<?php
$ftp->delete($file); ?>
Code:
<?php
class FTP {
private $ftp;
public function __construct($host, $port = 21, $timeout = 90) {
$this->ftp = ftp_connect($host, $port, $timeout);
}
public function __destruct() {
@ftp_close($this->ftp);
}
public function __call($function, $arguments) {
array_unshift($arguments, $this->ftp);
return call_user_func_array('ftp_' . $function, $arguments);
}
}
?>
Kristy Christie (kristy at isp7 dot net)
15-Jun-2004 11:50
Here's a little function that I created to recurse through a local directory and upload the entire contents to a remote FTP server.
In the example, I'm trying to copy the entire "iwm" directory located at /home/kristy/scripts/iwm to a remote server's /public_html/test/ via FTP.
The only trouble is that for the line "if (!ftp_chdir($ftpc,$ftproot.$srcrela))", which I use to check if the directory already exists on the remote server, spits out a warning about being unable to change to that directory if it doesn't exist.
But an error handler should take care of it.
My thanks to the person who posted the snippet on retrieving the list of files in a directory.
For the version of the script that echo's it's progress as it recurses & uploads, go to: http://pastebin.com/73784
<?php
$ftproot = "/public_html/test/";
$srcroot = "/home/kristy/scripts/";
$srcrela = "iwm/";
$ftpc = ftp_connect("ftp.mydomain.com");
$ftpr = ftp_login($ftpc,"username","password");
if ((!$ftpc) || (!$ftpr)) { echo "FTP connection not established!"; die(); }
if (!chdir($srcroot)) { echo "Could not enter local source root directory."; die(); }
if (!ftp_chdir($ftpc,$ftproot)) { echo "Could not enter FTP root directory."; die(); }
ftpRec ($srcrela);
ftp_close($ftpc);
function ftpRec ($srcrela)
{
global $srcroot;
global $ftproot;
global $ftpc;
global $ftpr;
chdir($srcroot.$srcrela);
if (!ftp_chdir($ftpc,$ftproot.$srcrela))
{
ftp_mkdir ($ftpc,$ftproot.$srcrela);
ftp_chdir ($ftpc,$ftproot.$srcrela);
}
if ($handle = opendir("."))
{
while (false !== ($fil = readdir($handle)))
{
if ($fil != "." && $fil != "..")
{
if (!is_dir($fil))
{
ftp_put($ftpc, $ftproot.$srcrela.$fil, $fil, FTP_BINARY);
}
else
{
if ($fil == "templates")
{
}
else
{
ftpRec ($srcrela.$fil."/");
chdir ("../");
}
}
}
}
closedir($handle);
}
}
?>
Vikrant Korde <vakorde at hotmail dot com>
14-Nov-2003 05:35
<?
//If you want to move or replicate the folder hierarchy from your current server to another remote server. Then this will be helpful as this will browse the current server's directory and at the same time it will copy that file in the remote server in the same directory.
//This script will copy all the files from this directory and subdirectory to another remote server via FTP
function rec_copy ($source_path, $destination_path, $con)
{
ftp_mkdir($con, $destination_path);
ftp_site($con, 'CHMOD 0777 '.$destination_path);
ftp_chdir($con,$destination_path);
if (is_dir($source_path))
{
chdir($source_path);
$handle=opendir('.');
while (($file = readdir($handle))!==false)
{
if (($file != ".") && ($file != ".."))
{
if (is_dir($file))
{
// here i am restricting the folder name 'propertyimages' from being copied to remote server. -- VK
if($file != "propertyimages")
{
rec_copy ($source_path."/".$file, $file, $con);
chdir($source_path);
ftp_cdup($con);
}
}
if (is_file($file))
{
$fp = fopen($file,"r");
// this will convert spaces to '_' so that it will not throw error. -- VK
ftp_fput ($con, str_replace(" ", "_", $file), $fp,FTP_BINARY);
ftp_site($con, 'CHMOD 0755 '.str_replace(" ", "_", $file));
}
}
}
closedir($handle);
}
}
// make a FTP connection --VK
$con = ftp_connect("69.18.213.131",21);
$login_result = ftp_login($con,"username","password");
// this is the root path for the remote server-- VK
$rootpath = "mainwebsite_html";
// this is the physical path of the source directory. actually u can also use the relative path. -- VK
$sourcepath = realpath("../")."/resdesk";
// this directory name will only change the top most directory and not the inner one -- VK
$destination_dir_name = "resdesk_".$account_id."/";
rec_copy ($sourcepath, $destination_dir_name, $con);
if (function_exists("ftp_close"))
{
ftp_close($con);
}
?>
postmaster at alishomepage dot com
24-Oct-2003 04:06
Here's another FTP interface over PHP (also uses MySQL)
http://myftp.alishomepage.com
PS: this script will ALSO allow you to download its source... So it becomes interesting for YOU PROGRAMMERS as well :D
NOSPAMkent at ioflux dot NOSPAM dot com
19-Sep-2002 05:05
I think what some other posts were trying to say which may need clarification is that in PHP 4.2.3, ftp_connect("myhost.com") was failing most of the time, except it would work like every few minutes.
The fix is that ftp_connect seems to have a bug resolving addresses. If you do:
$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);
It seems to solve the problem.
(Other users referred to an ftpbuf() error... not sure what that is, but this should fix it.)
sven at cartell-network dot de
13-Feb-2002 11:27
connection to a ftp server across proxy
$ftp_server = "proxy"; f.e. 123.456.789.10
$ftp_user_name = "username@ftpserver"; f.e. exampleuk@www.example.uk
$ftp_user_pass = "password";
$conn_id = ftp_connect($ftp_server, 2121);
$login_result = ftp_login( $conn_id, $ftp_user_name, $ftp_user_pass );
|