人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

org.apache.commons.net.ftpライブラリを使って、
リモートのサーバから、ローカルPCに .wavファイルをダウンロードするテストを行いました。
下記の参考サイトと全く同じ手順でコードを書きました。
http://www.syboos.jp/java/doc/jakarta-commons-net-ftpclient.html
リモートサーバからローカルPCに .wavファイルのダウンロードは完了するのですが、
それをWindowsMediaPlayerで再生してみると、下記のエラーウィンドウが出ます。
『ファイルを再生できません。プレーヤーがそのファイルの種類をサポートしていないか、そのファイルの圧縮に使用したコーデックをサポートしていない可能性があります。』

Windowsのコマンドプロンプトから ftp.exeでログインし、同じ.wavファイルをgetコマンドでローカルPCにダウンロードした場合、
そのファイルは WindowsMediaPlayerで再生可能です。

org.apache.commons.net.ftpライブラリでは、他に必要な手順があるのでしょうか?
どなたか、ご教授の方お願いします。

サーバOS:WindowsServer2003R2Enterprise 32bit
ローカルPCのOS:Vista Home Premium
JavaJDK:1.6.0_21
org.apache.commons.net:2.2

1300077764
●拡大する

●質問者: gdwtseq
●カテゴリ:コンピュータ インターネット
✍キーワード:.NET Apache commons exe FTP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● deflation
●23ポイント ベストアンサー

ご質問にあったJavaソースのmainメソッドに下記★印の2行を追加してみてください。

public static void main(String[] args) { 
 try { 
 //ファイルアップロード 
 FileInputStream fis = new FileInputStream("c:\testftp.txt"); 
 
 FtpClientHelper.sendFile("localhost", FTP_PORT, "testuser", "testpassword",
 "remoteFilename", fis); 
 
 //ファイルダウンロード 
 FileOutputStream fos = new FileOutputStream("localfile"); 
 FtpClientHelper.retrieveFile("localhost", FTP_PORT, "testuser", "testpassword", 
 "remoteFilename", fos); 
 fos.flush(); //★追加
 fos.close(); //★追加
 } catch (Exception e) { 
 e.printStackTrace(); 
 }
}

参考「バイナリファイルの入出力

◎質問者からの返答

ご返信有難うございます。

上記★2行追加+ビルドして、実行を行いましたが

結果は同じでした。


2 ● こうき
●23ポイント

public static void main(String[] args) {

try {

//ファイルアップロード

FileInputStream fis = new FileInputStream("c:\testftp.txt");

FtpClientHelper.sendFile("localhost", FTP_PORT, "testuser", "testpassword",

"remoteFilename", fis);

//ファイルダウンロード

FileOutputStream fos = new FileOutputStream("localfile");

FtpClientHelper.retrieveFile("localhost", FTP_PORT, "testuser", "testpassword",

"remoteFilename", fos);

fos.flush(); //★追加

fos.close(); //★追加

} catch (Exception e) {

e.printStackTrace();

}

やくにたちますか?

http://www.hatena.ne.jp/

◎質問者からの返答

前の方と同じ回答でした。

同じく、実行後改善は見られません。


3 ● a-kuma3
●22ポイント
FileOutputStream fos = new FileOutputStream("localfile");

ローカルのファイル名を、localfile.wav のように、拡張子を付けたらどうなりますか?


http://www.syboos.jp/java/doc/jakarta-commons-net-ftpclient.html

◎質問者からの返答

返信有難うございます。

拡張子対しては、実際はそのように書いています。しかし、再生できない。。

追記:

下記のコードで例外処理を加えたところ、エラーが発生していることを確認しました。

/* ファイル受信のコード部分 */

if( !ftpclient.retrieveFile( "D:\\data\\remoteFile.wav", os ) ) {

throw new Exception( "failed to download a file." );

}

ダウンロードが正常に終了していない?

追記2:

また、printWorkingDirectory()メソッドで確認すると↓の"/"という文字列を確認できました。

String pwd1 = ftpclient.printWorkingDirectory();

System.out.println( "1stディレクトリ: " + pwd1 ); // "/"という文字列

その後、changeWorkingDirectory()メソッドで、

changeWorkingDirectory("D:\\data") を行わせると、

FTP Response: 550 CWD command failed. "/D:\\data" という反応をWiresharkアナライザで確認できました。

実は、FTPサーバソフトウェアは、サードパーティ製のものを使っています。


4 ● a-kuma3
●22ポイント

お、相手サーバは Windows ?

if( !ftpclient.retrieveFile( "D:\\data\\remoteFile.wav", os ) ) {

これって、ftp.exe を使ったときに、ログインした直後に

get d:\data\remoteFile.wav

って、やっても成功します?

ログインしたときのカレントディレクトリが d:\data になってて、get remoteFile.wav って、やってるとかじゃないです?

フルパスで取得できるかどうかは、相手サーバの設定次第ですけど、普通はできなくしてあると思いますよ。


# 回答レベルに達して無いけど、コメントが空いてないので失礼


http://dummy/

◎質問者からの返答

getコマンドでは、フルパスでも成功します。

そして、解決しました。

ログインしたときのカレントディレクトリは、"D:\" なのですが、

pwdコマンドが返す表記が "/"でした。

よって、"d:\\data\\remoteFile.wav" ではなく、↓

ftpclient.retrieveFile( "/data/remoteFile.wav", os ); で、

正常にダウンロードが完了しました。

いろいろご指摘ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ