PHPのお勉強!

PHP TOP

FTP 関数

目次

  • ftp_alloc — アップロードされるファイルのためのスペースを確保する
  • ftp_append — ファイルの内容をFTPサーバー上の別のファイルに追加する
  • ftp_cdup — 親ディレクトリに移動する
  • ftp_chdir — FTP サーバー上でディレクトリを移動する
  • ftp_chmod — FTP 経由でファイルのパーミッションを設定する
  • ftp_close — FTP 接続を閉じる
  • ftp_connect — FTP 接続をオープンする
  • ftp_delete — FTP サーバー上のファイルを削除する
  • ftp_exec — FTP サーバー上でのコマンドの実行をリクエストする
  • ftp_fget — FTP サーバーからファイルをダウンロードし、オープン中のファイルに保存する
  • ftp_fput — オープン中のファイルを FTP サーバーにアップロードする
  • ftp_get — FTP サーバーからファイルをダウンロードする
  • ftp_get_option — カレントの FTP 接続での種々の実行時動作を取得する
  • ftp_login — FTP 接続にログインする
  • ftp_mdtm — 指定したファイルが最後に更新された時刻を返す
  • ftp_mkdir — ディレクトリを作成する
  • ftp_mlsd — ディレクトリに存在するファイルの一覧を返す
  • 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 — セキュアな SSL-FTP 接続をオープンする
  • ftp_systype — リモート FTP サーバーのシステム型 ID を返す
add a note

User Contributed Notes 16 notes

up
4
nicklas at programmera dot nu
18 years ago
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 STDIN isn't defined, define it
if (!defined("STDIN"))
{

define("STDIN", fopen("php://stdin", "r"));

}

echo
"FTP file uploader\r\n\r\n";

echo
"Server: ";

//trim() all the fgets cause it seams to add a \n
$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")
{

//enable passive mode
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));

//escape the uploading process by typing "exit;"
if ($file == "exit;")
{

exit;

}

//use "$file, $file" since the file shouldn't be renamed, also if its a binary file change the last argument to FTP_BINARY
$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);

?>
up
3
cgray at premierconsulting dot com (Chris Gray)
18 years ago
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']; // This will make an array out of the file information that was stored.
$file = $myFile['tmp_name']; //Converts the array into a new string containing the path name on the server where your file is.

$myFileName = basename($_POST['txt_fileName']); //Retrieve filename out of file path

$destination_file = "/".$myFileName; //where you want to throw the file on the webserver (relative to your login dir)

// connection settings
$ftp_server = "127.0.0.1"; //address of ftp server.
$ftp_user_name = "Your UserName"; // Username
$ftp_user_pass = "Your Password"; // Password

$conn_id = ftp_connect($ftp_server); // set up basic connection
$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>"); // login with username and password, or give invalid user message
if ((!$conn_id) || (!$login_result)) { // check connection
// wont ever hit this, b/c of the die call on ftp_login
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, $file, FTP_BINARY); // upload the file
if (!$upload) { // check upload status
echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
} else {
echo
"Uploading $myFileName Complete!<br /><br />";
}

ftp_close($conn_id); // close the FTP stream
}
?>

<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>
up
2
dot a dot@dot dot com
17 years ago
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']; // This will make an array out of the file information that was stored.
$file = $myFile['tmp_name']; //Converts the array into a new string containing the path name on the server where your file is.
$myFileName = $_POST['MyFile']; //Retrieve file path and file name
$myfile_replace = str_replace('\\', '/', $myFileName); //convert path for use with unix
$myfile = basename($myfile_replace); //extract file name from path
$destination_file = "/".$myfile; //where you want to throw the file on the webserver (relative to your login dir)
// connection settings
$ftp_server = "127.0.0.1"; //address of ftp server (leave out ftp://)
$ftp_user_name = ""; // Username
$ftp_user_pass = ""; // Password
$conn_id = ftp_connect($ftp_server); // set up basic connection
// login with username and password, or give invalid user message
$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); // upload the file
if (!$upload) { // check upload status
echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
}
/*
// try to delete $file
if (ftp_delete($conn_id, $destination_file)) {
echo "$destination_file has been deleted!\n";
} else {
echo "Could not delete $destination_file!\n";
}
*/
ftp_close($conn_id); // close the FTP stream
}
?>
<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>
up
1
ras "at" fyn {dot} dk
17 years ago
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.
up
0
dickiedyce at uk dot com
19 years ago
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

// setup $host and $file variables for your setup before here...

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

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

// IMPORTANT!!! turn passive mode on
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>";

// upload a file
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>";
}

// close the connection
ftp_close($conn_id);
}
?>
up
0
postmaster at alishomepage dot com
20 years ago
I have written an OpenSource ZIP2FTP interface, which actually takes a given ZIP file and decompresses it in the folder on an FTP server you specify...

Therefore it may be quite interesting for you people interested in FTP, its adress is http://zip2ftp.alishomepage.com ; those who directly want the source may visit http://zip2ftp.alishomepage.com/?do=getSource
up
0
Vikrant Korde <vakorde at hotmail dot com>
21 years ago
<?

//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);
}
?>
up
0
NOSPAMkent at ioflux dot NOSPAM dot com
22 years ago
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.)
up
-1
Kristy Christie (kristy at isp7 dot net)
20 years ago
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

// --------------------------------------------------------------------
// THE TRIGGER
// --------------------------------------------------------------------

// set the various variables
$ftproot = "/public_html/test/";
$srcroot = "/home/kristy/scripts/";
$srcrela = "iwm/";

// connect to the destination FTP & enter appropriate directories both locally and remotely
$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(); }

// start ftp'ing over the directory recursively
ftpRec ($srcrela);

// close the FTP connection
ftp_close($ftpc);

// --------------------------------------------------------------------
// THE ACTUAL FUNCTION
// --------------------------------------------------------------------
function ftpRec ($srcrela)
{
global
$srcroot;
global
$ftproot;
global
$ftpc;
global
$ftpr;

// enter the local directory to be recursed through
chdir($srcroot.$srcrela);

// check if the directory exists & change to it on the destination
if (!ftp_chdir($ftpc,$ftproot.$srcrela))
{
// remote directory doesn't exist so create & enter it
ftp_mkdir ($ftpc,$ftproot.$srcrela);
ftp_chdir ($ftpc,$ftproot.$srcrela);
}

if (
$handle = opendir("."))
{
while (
false !== ($fil = readdir($handle)))
{
if (
$fil != "." && $fil != "..")
{
// check if it's a file or directory
if (!is_dir($fil))
{
// it's a file so upload it
ftp_put($ftpc, $ftproot.$srcrela.$fil, $fil, FTP_BINARY);
}
else
{
// it's a directory so recurse through it
if ($fil == "templates")
{
// I want the script to ignore any directories named "templates"
// and therefore, not recurse through them and upload their contents
}
else
{
ftpRec ($srcrela.$fil."/");
chdir ("../");
}
}
}
}
closedir($handle);
}
}
?>
up
-1
spam at kacke dot de
16 years ago
Here is a FTP-abstraction-class which supports the most commands.

Also it works on TLS, SSLv2 etc. by using stream_crypto_enable()

http://kacke.de/php_samples/source.php?f=ftp.cls.php

Many thanks to WEZ at this point after all the years :-)

Toppi