1300077764 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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2011/03/15 23:22:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:deflation No.1

回答回数1036ベストアンサー獲得回数126

ポイント23pt

ご質問にあった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();  
    }
}

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

id:gdwtseq

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

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

結果は同じでした。

2011/03/14 18:36:37

その他の回答3件)

id:deflation No.1

回答回数1036ベストアンサー獲得回数126ここでベストアンサー

ポイント23pt

ご質問にあった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();  
    }
}

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

id:gdwtseq

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

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

結果は同じでした。

2011/03/14 18:36:37
id:toshiki2131 No.2

回答回数31ベストアンサー獲得回数0

ポイント23pt

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/

id:gdwtseq

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

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

2011/03/14 22:40:12
id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント22pt
FileOutputStream fos = new FileOutputStream("localfile");

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


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

id:gdwtseq

返信有難うございます。

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

追記:

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

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

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サーバソフトウェアは、サードパーティ製のものを使っています。

2011/03/15 19:53:06
id:a-kuma3 No.4

回答回数4973ベストアンサー獲得回数2154

ポイント22pt

お、相手サーバは Windows ?

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

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

get d:\data\remoteFile.wav

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

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

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


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


http://dummy/

id:gdwtseq

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

そして、解決しました。

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

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

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

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

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

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

2011/03/15 23:21:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません