リモートのサーバから、ローカル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
ご質問にあった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(); } }
参考「バイナリファイルの入出力」
ご質問にあった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行追加+ビルドして、実行を行いましたが
結果は同じでした。
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();
}
やくにたちますか?
前の方と同じ回答でした。
同じく、実行後改善は見られません。
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サーバソフトウェアは、サードパーティ製のものを使っています。
お、相手サーバは Windows ?
if( !ftpclient.retrieveFile( "D:\\data\\remoteFile.wav", os ) ) {
これって、ftp.exe を使ったときに、ログインした直後に
get d:\data\remoteFile.wav
って、やっても成功します?
ログインしたときのカレントディレクトリが d:\data になってて、get remoteFile.wav って、やってるとかじゃないです?
フルパスで取得できるかどうかは、相手サーバの設定次第ですけど、普通はできなくしてあると思いますよ。
# 回答レベルに達して無いけど、コメントが空いてないので失礼
getコマンドでは、フルパスでも成功します。
そして、解決しました。
ログインしたときのカレントディレクトリは、"D:\" なのですが、
pwdコマンドが返す表記が "/"でした。
よって、"d:\\data\\remoteFile.wav" ではなく、↓
ftpclient.retrieveFile( "/data/remoteFile.wav", os ); で、
正常にダウンロードが完了しました。
いろいろご指摘ありがとうございました。
ご返信有難うございます。
上記★2行追加+ビルドして、実行を行いましたが
結果は同じでした。