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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- WordPress(ワードプレス) WordPressのサイトにPDFをアップロードした際にGoogleなどの検索結果に出ないでほしい 1 2022/08/03 10:44
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
FTP接続の例外処理
-
youtubeに音声のみのmp4ファイ...
-
one drive のアップロード失敗...
-
ファイルアップロードの上限を...
-
全角ファイル名をアップロード...
-
ファイルアップロードしたもの...
-
画面遷移させずに、選択画像フ...
-
VBでクラウドストレージにア...
-
複数ファイルのアップロードに...
-
ファイルアップロードについて...
-
大容量のファイルアップロード...
-
PHP 画像アップロード 重複防止
-
ftpでアップロードが出来ない
-
ファイルをGET送信でアップロー...
-
ファイルのアップロードで、フ...
-
ファイルのアップロードを行う...
-
FTPClientで転送結果(OKかFAIL)
-
ファイルのアップロード$_FILES...
-
ガラケーサイトで写真のアップ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
one drive のアップロード失敗...
-
youtubeに音声のみのmp4ファイ...
-
wixの使い方について
-
ftpでアップロードが出来ない
-
「クラウドにアップロード」」...
-
ファイルサイズがpost_max_size...
-
VBでクラウドストレージにア...
-
大容量のファイルアップロード...
-
画像ファイルの名前をそのままU...
-
どうして送信されないのでしょ...
-
ファイルアップロードの上限を...
-
PHPでxmlをAPIに送信する方法(P...
-
ファイルをGET送信でアップロー...
-
unlinkでどうしてもファイルが...
-
FTPClientで転送結果(OKかFAIL)
-
ファイルのアップロードでパス...
-
$filePath = './user_img/' . $...
-
FTP接続の例外処理
-
move_uploaded_fileについて
おすすめ情報