PHPコーディング

ソケットをオープンしてファイル操作をする(get)

2010年02月08日
今度は、ファイル情報取得やファイル削除よりちょっと複雑なファイルのアップロード(put)やダウンロード(get)などです。

put・getはftpサーバーへログインした接続とは別の接続をオープンして行います。

ローカルへファイルを作成します。
$localfile = "local.txt";
$local = @fopen($localfile, "w");

ファイル転送モードを指定します。
バイナリならば、【I】、アスキーなら【A】です。
@fputs($sock, "TYPE I\r\n");
$result = @fgets($sock, 512);

パッシブモードをオンにします。
@fputs($sock, "PASV\r\n");
$result = @fgets($sock, 512);
成功すれば、【227 Entering Passive Mode (200,0,0,1,100,32)】という具合に、メッセージの後にサーバのIPアドレスとデータ接続用のポート番号が返ってきます。
【200,0,0,1,100,32】がそれです。初めの4つがIPアドレス、後ろの2つがデータ用のポート番号です。
ここから接続用のポート番号を取り出します。

ポート番号は
$data_port = 後ろから2番目の数値 * 256 + 一番後ろの数値
で計算できます。
100 * 256 + 32 = 25632

データ用の接続をオープンします。
$ftp = @fsockopen($ftp_server, $data_port);

リモートのファイルを読み込みます。
$remotefile = "remote.txt";
@fputs($sock, "RETR ".$remotefile."\r\n");

ローカルのファイルへ書き込みます。
$result = @fwrite($local, @fread($ftp, 100000));

念のため、書き込んだファイルサイズを照合したほうがいいでしょう。
ローカルへ書き込んだファイルサイズは、【fwrite】の戻り値でチェックできます。

一方、リモート側のサイズは、
@fputs($sock, "SIZE ".$remotefile."\r\n");
$result = @fgets($sock, 512);
成功すれば、【213】に続き、サイズが戻ってきます。

データ用の接続をクローズします。
@fclose($ftp);

念のため一時バックアップファイルを作成しておき、書き込みに失敗したときに書き戻す機能をつけておけば更に安心でしょう。


ローカルのファイルに追記したい場合、ファイルオープンのとき、モードパラメータで【a】を指定すればOKです。
$local = @fopen($localfile, "a");
2010年02月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
先月
来月
カテゴリ
検索
関連サイト
プロフィール
【ネットネーム】
みゅー

キャラクター by ツカエルサイト


【趣味】
・プログラミング
・写真
・楽器演奏
・手芸
・日曜大工
・家の中の不便を便利に
・考える
・自然科学
・猫と戯れる
・ジグソーパズル

【仕事】
・派遣社員でSE・PGやっていました。次の良い仕事がみつからないので、ビジネスへ注力しようと思っています。
・経験言語:VB6、VB.NET、PHP、Perl、JAVA、Oracle、SQLServer、PostgreSQL



【名前】
アン(足)

2014年4月22日生まれ 女の子
あだ名は くノ一
普段は普通にしゃべりますが、興奮すると『ニャ』を連発します

【趣味】
・狩
・ご飯を食べる
・ママのお手伝い

【仕事】
ママのビジネスの看板招き猫
ママの代わりにPC入力
仕事中のママの右腕を温める
ママに心配をかける
いろんな事をしでかしてママを退屈させない

RSSフィード
コメント
パトカーってハチワレ
2018-10-15 16:15:11
パトカーってハチワレ
2018-10-15 16:12:42
Tweet