質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

14378閲覧

JavaでFTP転送プログラムを作成したが、受信ファイルが0バイトになる

javabigineer

総合スコア87

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/12/18 07:08

編集2015/12/21 09:12

Java言語でtar.gzファイルを受信するFTP転送プログラムを自作しています。
FTPClientを使用して、retrieveFile()関数にて実行しています。
OutputStreamもflushを行っていますが、受信ファイルが0バイトになってしまいます。
なにか他に考えられる原因はないでしょうか?

追記
説明不足で申し訳ありません。Apach CommonsのFTPClientのことです。
Java1.6 commons-net3.4.jarです
以下の処理では「結果ファイル」というログファイルとtar.gzファイルを受信しています。ログファイルはFTP成功していますが、tar.gzファイルが0バイトになっています。

以下ソースコード(一部抜粋)
String ftpconnect = "IP"
System.out.println(ftpconnect + "に接続します");
System.out.println(ftpport);
try {
// 接続先に接続する
fp.connect(ftpconnect,ftpport);
if (!FTPReply.isPositiveCompletion(fp.getReplyCode())) { // コネクトできたか?
// 失敗した場合
System.out.println("connection failed");
}

//==== タイムアウト時間設定 ====// fp.setSoTimeout(1200000); //20分 // 接続先にユーザ名指定してログインする if (fp.login(loginuser, password) == false) { // ログインできたか? // 失敗した場合 System.out.println("login failed"); } //==== 転送モード設定 ====// fp.setFileType(FTP.BINARY_FILE_TYPE); fp.enterLocalPassiveMode();

// 指定ディレクトリ内のファイル名を全取得
String[] flist = fp.listNames(sv_input);
String resultchk = "";
try{
//結果ファイル存在チェック
resultchk = resc.resultCheck(flist);
System.out.println(resultchk);
}catch(NullPointerException e){
System.out.println("ファイルが存在しません。");
}
// ファイルが存在する場合
if (!resultchk.isEmpty()) {
//ファイル受信
String tmp = work;
StringBuilder rsb = new StringBuilder(tmp);
File exporesult = new File(rsb.append(CheckResult.EXPORTRESULT).toString());

os = new FileOutputStream(exporesult);// クライアント側
System.out.println(resultchk);
fp.retrieveFile(resultchk, os);// サーバー側
System.out.println("抜出結果ファイル FTP GET COMPLETED");
// 結果ファイル内に"OK"の記述がある場合
if (resc.resultContents(exporesult)) {
System.out.println("抜出結果:OK");
// FTP転送実行
if (ftpflg.equals("rec")) { // ftpflg=rec(受信)
// ファイル受信
String inputfile = "";
for (int j = 0; j < flist.length; j++) { inputfile = flist[j];
if (inputfile.indexOf(".tar.gz") != -1) { // tar.gzファイルのみFTP転送実行
//転送対象のファイル名のみ取得
inputfile = inputfile.substring(inputfile.lastIndexOf("/"));
//転送対象ファイルパス生成
inputfile = clsb.append(inputfile).toString();
File input = new File(inputfile);
//同一ファイルが既に存在していた場合削除
fUtil.Deletefile(input);
//出力ファイル作成
fUtil.makefile(dir, input);
os = new FileOutputStream(input);// クライアント側
fp.retrieveFile(sv_input, os);// サーバー側
os.flush();
os.close();
System.out.println("FTP GET COMPLETED");
} else {
System.out.println("対象圧縮資産は存在しません。");
continu
}
} }
} else { System.out.println("対象圧縮資産は存在しません。");
//tar.gzファイル以外はスキップ
continue;
}
}
}

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/12/18 07:13

可能な限り、ソースコードを提示してください。また、FTPClientとは、Apache CommonsのFTPClientのことでしょうか?使用しているJavaとライブラリのバージョンも提示していただければと思います。
guest

回答2

0

ベストアンサー

sv_inputという変数は、以下の個所ではディレクトリ名として用いられ、

lang

1 // 指定ディレクトリ内のファイル名を全取得 2 String[] flist = fp.listNames(sv_input);

以下の個所では、ファイル名として用いられているようです。

lang

1 fp.retrieveFile(sv_input, os);// サーバー側

2番目の個所では、sv_inputでなく、flist[j]などにする必要があるのではないでしょうか?

投稿2015/12/21 09:30

編集2015/12/21 09:48
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javabigineer

2015/12/21 09:55

こんな簡単なミス。。。自分では気づきませんでした。汗 正常に受信することができました。ありがとうございました!!
guest

0

サーバーに権限が付与されていないか?
受信完了前にタイムアウトで切れていないですか?

投稿2015/12/18 12:55

KiyoshiMishima

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javabigineer

2015/12/21 02:49

サーバに接続するときにroot権限で接続していますし、タイムアウト時間も余裕を持たせてみましたが、同じ結果でした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問