org.apache.commons.net.ftp.FTPClientを使ってファイル転送をしています。
storeFileした結果を取得する方法はないでしょうか。
結果がOKであれば、そのまま処理を終わり、FAILであれば再度アップロード
させたいと思っています。
上記に至った経緯は下記の通りです。
もともと、
ログイン⇒ファイルアップロード⇒ログアウト
というメソッドを作り、複数ファイルを上記メソッドを使ってアップロードして
いるのですが、時折(不定期に)ファイル転送に失敗してファイルサイズが
0になっていました。
そこで、下記のようにメソッドの仕様を変更ました。
ログイン⇒アップロード⇒アップしたファイルをダウンロードしてサイズチェック
⇒ファイルサイズが0の場合は再度アップード⇒ログアウト
すると今度は、一回目のアップロードは問題ないのに、ダウンロードが失敗
してファイルサイズが0となり、再アップロードするとファイルサイズが0になって
しまう(この時のFTPのステータスはOKでした)という現象が発生してしまい
ました。
ファイルダウンロード時にFAILになるようでは、意味がいないので、一回目の
アップロード結果を別の方法で取得できないか、というのが今回質問に至った
経緯です。
ちなみに、今の仕様だと複数ファイルアップする場合、
ログイン⇒処理⇒ログアウト⇒ログイン⇒処理⇒ログアウト・・・
という処理になっています。
これって不必要にログインとログアウトを繰り返しているように思うので、それが
ファイルアップロード失敗する一因ではと危惧しているのですが、その点もご意見
いただければ嬉しいです。
なお、
ログイン⇒ファイル1アップ⇒ファイル2アップ⇒…⇒ログアウト
に変更する場合、ftpのモードはpassvにする必要がありますか?現在はpassvではあ
りません。
参考までに、Javaソースを下記に記載しておきます。
どうぞよろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public String putFile(String filepath, byte[] bytes) throws IOException {
FTPClient ftp = null;
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
try {
// FTP 接続を行う
ftp = connect();
// ファイル送信
bais = new ByteArrayInputStream(bytes);
filepath = baseDir + filepath;
// ディレクトリが存在しなければ生成する
String path = "";
String[] dirs = filepath.split("/+");
for (int i = 0; i < dirs.length - 2; i++) {
System.err.println("dirs:" + dirs[i]);
if(dirs[i].equals("")){
continue;
}
path += dirs[i] + "/";
FTPFile[] files = ftp.listFiles(path);
int j;
for (j = 0; j < files.length; j++) {
if (files[j].getName().equals(dirs[i + 1]))
break;
}
if (j < files.length)
continue;
if (!dirs[i + 1].equals("..") ){
ftp.makeDirectory(path + dirs[i + 1]);
}
}
ftp.storeFile(filepath, bais);
// ファイルサイズが0になる問題対応
// ファイルアップ後にファイルを取得してサイズが0なら再アップする
// ファイル受信
baos = new ByteArrayOutputStream();
ftp.retrieveFile(filepath, baos);
if(baos.toByteArray().length == 0)
ftp.storeFile(filepath, bais);
return filepath;
}
catch (IOException ioe) {
String msg = String.format("FTP によるファイル送信に失敗しました。(%s)", ioe.getMessage());
log.error(msg);
throw new FileTransferException(msg);
}
finally {
close(ftp, bais);
}
}
No.1ベストアンサー
- 回答日時:
環境がないのであくまで推測でのコメント
アップロードに失敗しているときって
例外が発生したりはしていないの?
複数アップロードのときは
このメソッドの外でFTPをOPEN/CLOSEすれば
いいだけじゃないのかな?
ダメだったらゴメンなさい
お返事ありがとうございます。
例外は発生していないので、ftpの問題と気づくまで時間がかかってしまいました。
一応try catchしているのですが…
ftp(vsftp)のログを見ると下記の様にFAILとなっていたので、FTP失敗してるんだと
なったわけです。
Wed Apr 4 12:10:04 2012 [pid xxxxx] [hoge] FAIL UPLOAD: Client "xxx.xxx.xxx.xxx", "/home/release/html/xxx.html", 0.00Kbyte/sec
Thu Apr 5 11:00:02 2012 [pid xxxxx] [hoge] FAIL DOWNLOAD: Client "xxx.xxx.xxx.xxx", "/home/release/html/xxxx.gif", 0.00Kbyte/sec
そうですね、複数アップロードの時はご指摘の通り接続をこのメソッドの外で
行うように変更する予定です。
ただ、いろいろと調べるとftpで複数ファイルアップの際はPASSIVモードじゃないと失敗する
確率が高そうな感じだったので、単にメソッドの仕様を変更するだけではだめのか??と
疑問に思っているところ(調査継続中です)です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
ファイルのアップロードで、フ...
-
FTP接続の例外処理
-
FTPClientで転送結果(OKかFAIL)
-
SmartyでHTMLソースの変更が反...
-
PHPで音楽ファイルのアップ...
-
unlinkでどうしてもファイルが...
-
ftpでアップロードが出来ない
-
違法アップロードについて
-
お悩み相談です(※長文な上にか...
-
「クラウドにアップロード」」...
-
ファイルアップロードの上限を...
-
ファイルサイズがpost_max_size...
-
PHPのif文でその処理を途中で抜...
-
Subversionのリポジトリの削除
-
PHPにおける時間計算、時間足し...
-
【file_exists】ファイルが存在...
-
xamppでGDを使いたい。
-
VBSの「MsgBox」について
-
SSI される .inc ファイル内に ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
違法アップロードについて
-
ftpでアップロードが出来ない
-
「クラウドにアップロード」」...
-
youtubeに音声のみのmp4ファイ...
-
FTPClientで転送結果(OKかFAIL)
-
ファイルをGET送信でアップロー...
-
SmartyでHTMLソースの変更が反...
-
one drive のアップロード失敗...
-
ファイルのアップロードでパス...
-
Struts2 ファイルアップロード
-
CGI(掲示板)へPDFをアップしたい
-
VBでクラウドストレージにア...
-
unlinkでどうしてもファイルが...
-
csvファイルをMySQLにインポー...
-
Dreamweaverは使わないでPHPガ...
-
ファイルアップロードについて...
-
どうして送信されないのでしょ...
-
ファイルをアップする方法
-
ファイルのアップロードで文字...
おすすめ情報