アリスムカイデが“MV女優”になった原点MVをご紹介!

今回phpを使ってftp関数であるftp_getを実行してみたところ【Warning: ftp_get(): Error opening】が出てきました。
サイトで調べた結果、パスの指定のミスかパーミッションが原因だと言うことがわかりました。
それから小一時間あれこれ試してみましたがダメでした・・・。

そこで今度はperlを使って同じ内容のスクリプトを書いてみると成功しました。

どなたかphpの方ではなぜ正しく動作出来ないのかをご教示ください。

以下はphpとperlのスクリプトです。
===========================================================================
<?php
$FTPSERVER = "!!!";
$FTPUSER = "@@@";
$FTPPASSWORD = "***";

//ftpサーバに接続
$ftp = ftp_connect($FTPSERVER);
//ユーザログイン
ftp_login($ftp, $FTPUSER, $FTPPASSWORD);
ftp_pasv($ftp, true);

$srverfile = "test.txt";
$localfile = "data1.txt";

ftp_get($ftp, $localfile, $srverfile , FTP_BINARY);

ftp_quit($ftp);
?>
============================================================================
#!/usr/local/bin/perl

use Net::FTP;

my $host = '!!!';# 接続先
my $user = '@@@';# FTPのユーザ
my $pass = '***';# FTPのパスワード
my $remote_file = 'test.txt';# リモートのファイル(これを取得)
my $local_file = 'data1.txt';# ローカルファイル(ここに保存)

my $ftp = Net::FTP->new($host) or die "can not connection: $@";
$ftp->login($user, $pass) or die $ftp->message;# ログイン
$ftp->binary;# バイナリモードに変更
$ftp->get($remote_file, $local_file) or warn $ftp->message;# ファイル取得
$ftp->quit;# 終了

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ANo.1です。



補足説明ありがとうございます。
エラーメッセージは例示したものがすべてということは、ftp_getの第二引数が何らかの理由で正しく渡せていない(空の文字列が渡されている)のではないでしょうか。

この回答への補足

>エラーメッセージは「Warning: ftp_get(): Error opening」ですべてでしょうか。

この質問に関して取り違いていました。
エラーメッセージは正しくは
「Warning: ftp_get(): Error opening data.txt in phpのファイルパス on line 15」です。

すみませんでした。

補足日時:2009/09/24 01:26
    • good
    • 0

エラーメッセージは「Warning: ftp_get(): Error opening」ですべてでしょうか。

この回答への補足

ハイ、一つだけです。
phpの方でもディレクトリの移動などはできるのでログインは出来ていると思います。

補足日時:2009/09/24 00:45
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qftp_getできない?

レンタルサーバの自前のファイルサーバからFTP接続にてファイルを取得しようとしているのですが、エラーとなってしまいます。
FTP接続はできているのですが、ファイルの取得に失敗(FALSE)してしまいます。
レンタルサーバの環境は
OS:Linux
PHP:4.4.1
試しにftp_nlist関数にてファイル一覧を取得しようとしましたが、やはり失敗(FALSE)してしまいます。
知り合いのレンタルサーバを借用して全く同じプログラムを実行すると正常に一覧の取得ができました。
FTP接続時・ログイン時にはエラーが発生していないのでFTPでの転送は可能だと思うのですが、全くわかりません。
どなたか分かる方ご教授お願いします。

以下、スクリプトです。
if($ftp=ftp_connect($ftp_host)){
 if(ftp_login($ftp,$ftp_user,$ftp_pass)){
  //ファイルリスト一覧取得
   $file_list=ftp_nlist($ftp,".");
  var_dump($file_list);
  //ファイルダウンロード
   if(!(ftp_get($ftp,$local_file,$remote_file,FTP_BINARY))){
    エラー処理1;
   }
  }
  else{
    エラー処理2;
  }
}
else{
 エラー処理3;
}

レンタルサーバの自前のファイルサーバからFTP接続にてファイルを取得しようとしているのですが、エラーとなってしまいます。
FTP接続はできているのですが、ファイルの取得に失敗(FALSE)してしまいます。
レンタルサーバの環境は
OS:Linux
PHP:4.4.1
試しにftp_nlist関数にてファイル一覧を取得しようとしましたが、やはり失敗(FALSE)してしまいます。
知り合いのレンタルサーバを借用して全く同じプログラムを実行すると正常に一覧の取得ができました。
FTP接続時・ログイン時にはエラーが発...続きを読む

Aベストアンサー

サーバのファイヤウォールの設定によってはFTPサーバへの接続・切断はできても、一覧の取得やファイルの転送が正常に行えない場合があります。
この対処法として、FTPにはpassive modeという動作モードがあります。PHPではftp_pasvというコマンドでmodeを切り替えます。
たとえば、提示されたソースコードでは、$file_list=ftp_nlist($ftp,"."); の直前あたりに下記を追加してみてください。
ftp_pasv($ftp, true);
このコマンドの詳細は下記のドキュメントをご参照ください。
http://jp2.php.net/manual/ja/function.ftp-pasv.php
http://jp2.php.net/manual/ja/function.ftp-nlist.php#69140
なぜpassive modeが必要かについては、下記のURLが参考になります。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro10/netpro01.html
http://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html

サーバのファイヤウォールの設定によってはFTPサーバへの接続・切断はできても、一覧の取得やファイルの転送が正常に行えない場合があります。
この対処法として、FTPにはpassive modeという動作モードがあります。PHPではftp_pasvというコマンドでmodeを切り替えます。
たとえば、提示されたソースコードでは、$file_list=ftp_nlist($ftp,"."); の直前あたりに下記を追加してみてください。
ftp_pasv($ftp, true);
このコマンドの詳細は下記のドキュメントをご参照ください。
http://jp2.php.net/manual/ja/...続きを読む

QFTPでのファイルとディレクトリの判別

現在FTPにアクセスしてファイル操作をするプログラムを作っています。
その中でフォルダ(ディレクトリ)の一覧(名前)とファイルの一覧(名前)を別々に出したいのですが何か方法ありますでしょうか?

ftp_nlistで一覧を出せることはわかったのですが、どうやってフォルダなのかファイルなのかを切り分けていけばいいのかがわかりません。
ファイル名には拡張子がついていない場合もあるので「.xxx」というのが名前の最後にあるものがファイルという分け方もできません。

よろしくお願いいたします。

Aベストアンサー

参考URLに is_ftp_dir というサンプルプログラムがありますが、
これを使って(あるいは同様な方法で)ディレクトリであるかどうか判別できると思います。
逆に言えば、このようなサンプルを載せるということは、直接的な関数が無いことの表れであると思います。

参考URL:http://jp2.php.net/manual/ja/function.ftp-nlist.php

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

QPermission denied in

PHPを実行するとWarning: fopen failed to open stream Permission denied inと
表示されてしまいます。
インターネットを使い、調べてはいますが、
上記のように表示してしまいます。
ファイルです。パーミッションは606にしました。

このWarningを表示させないようにするには、どのようにすれば
良いのか教えて頂けると嬉しいです。

Aベストアンサー

あとは
> PHPを実行するユーザーとそのグループはどうなってますか?

PHPを直接コマンドラインから実行するのなら、ユーザーはあなたですが、httpサーバーでモジュールやCGIとして実行するなら別の権限(nobodyとか)になっていると思います。

あとは
ディレクトリのパーミッションを 707 にする
ディレクトリとファイルのオーナーをPHPを実行するユーザーにする
とかでしょうか。

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QPHPでFilename cannot be empty他の警告(Wa

PHPでFilename cannot be empty他の警告(Warning)発生しています。

PHP初心者です。
テンプレートを使ってファイルを作成する機能をつくりました。
一応動いているようなのですが、実行するとWarningが発生します。
解消する方法をご存知でしたらご教授ください。

オブジェクト指向で組んでみたので、それが原因かもと思うのですが、解消
策がわからず困っています。

よろしくお願いします。

◆警告メッセージ

Warning: fopen(): Filename cannot be empty in C:\path\CreateFile.php on line 31
Warning: fwrite() expects parameter 1 to be resource, boolean given in C:\path\CreateFile.php on line 32
Warning: fclose() expects parameter 1 to be resource, boolean given in C:\path\CreateFile.php on line 33

以下サンプルコードです。
◆クラスファイル
<?php
class CreateFile
{
// テンプレートファイル名
public $templateFile;
// 保存ファイル名
public $createdFile;
// 置換キーワードセット arrayで指定
public $values;

// ファイル生成
public function createFile()
{
// ファイルを生成する
$data = "";

if($this->templateFile){
$data = file_get_contents($this->templateFile);
}
if (is_array($this->values)) {
foreach ($this->values as $key => $val) {
$data = str_replace($key, $val, $data);
}
}
// ファイルを生成する
$fp = fopen($this->createdFile, 'w');
fwrite($fp, $data);
fclose($fp);
}
}

?>

◆メイン
<?php
require_once './class/CreateFile.php';

// インスタンス生成
$cdFile = new CreateFile();

// テンプレート名設定
$cdFile->templateFile = './template.tpl';
// 保存ファイル名設定
$cdFile->createdFile = './hoge.txt';

$cdFile->values = array('<%VALUE>' => 'テストです');

$cdFile->createFile();

echo '++++++++++ End CreateFile ++++++++++';

?>

PHPでFilename cannot be empty他の警告(Warning)発生しています。

PHP初心者です。
テンプレートを使ってファイルを作成する機能をつくりました。
一応動いているようなのですが、実行するとWarningが発生します。
解消する方法をご存知でしたらご教授ください。

オブジェクト指向で組んでみたので、それが原因かもと思うのですが、解消
策がわからず困っています。

よろしくお願いします。

◆警告メッセージ

Warning: fopen(): Filename cannot be empty in C:\path\CreateFile.php on line 31
Warning: f...続きを読む

Aベストアンサー

PHP4では、Javaと同じように、クラス名と同一のメソッド名を、コンストラクタとなってまして、
PHP5でも、下位互換のためにそうなります。

ので、メソッド名を変更してみてください。(executeとか、createとか)

Qすべてのテーブル削除

DELETE tbl1,tbl2,tbl3 FROM tbl1,tbl2,tbl3;
DROP TABLE tbl1,tbl2,tbl3 FROM tbl1,tbl2,tbl3;

以外で簡単に複数あるテーブルを削除する方法ってありますでしょうか?

Aベストアンサー

>すべてのテーブル削除

そもそもFROMはいらないでしょ・・・

DROP DATABASE hoge
で親DBを削除してつくりなおすとかありそうですが
ただ、テーブルの削除が頻繁に起こる運用というのは問題では?
ごくたまにしかないならテーブル名を指定して削除するのが妥当

Qftp_getでローカルにファイルが見当たらない

下記のようなスクリプトでFTPダウンロードを試みています。
ダウンロード元はホスティング会社のサーバで、
ダウンロード先は私のWindowsPCになります。

接続から読み込みまで万事うまく行き、エラー表示もなく、
Successfully written to C:\test\backup.zip
というメッセージが表示されるところまでいくのですが、
C:\test\を開けてみると肝心のファイルが見当たりません。

サーバやPCの設定等もあるかもしれませんが、
どのような原因が考えられますでしょうか?

よろしくお願いいたします。


<スクリプト>

$local_file = "C:\\test\\backup.zip";
$server_file = "/tmp/backup.zip";

$conn_id = ftp_connect($ftpserver);

$login_result = ftp_login($conn_id, $usr, $pass);

ftp_pasv($conn_id, true);

if(ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)){
echo "Successfully written to {$local_file}";
} else {
echo "There was a problem";
}

ftp_close($conn_id);

下記のようなスクリプトでFTPダウンロードを試みています。
ダウンロード元はホスティング会社のサーバで、
ダウンロード先は私のWindowsPCになります。

接続から読み込みまで万事うまく行き、エラー表示もなく、
Successfully written to C:\test\backup.zip
というメッセージが表示されるところまでいくのですが、
C:\test\を開けてみると肝心のファイルが見当たりません。

サーバやPCの設定等もあるかもしれませんが、
どのような原因が考えられますでしょうか?

よろしくお願いいたします。


<スクリプト...続きを読む

Aベストアンサー

>要するにローカルPCにサーバ上のファイルを保存するためには、
>ftp_getをローカルPCで実行しなくてはならないという理解でよろしいでしょうか?

そうですね。サーバ側のスクリプトを動かしたらローカルに勝手に(何の警告もなしに)ファイルが出来上がるようだと怖くて使えません。セキュリティ的にどう考えても無理だし、ましてサーバ側ではローカルPCのpathなんてわかりませんから、httpでダウンロードするにしても「ファイル名」しか指定出来ません(しかも「参考」程度の扱いですよね)。

ローカルPCにApacheとphpをインストールして、http://localhost/xxxxx.php にアクセスしてそのphpスクリプトがftp_getを実行することになりますが、そこまでしてftpクライアントを使わずにダウンロードする意味はないでしょう。


人気Q&Aランキング