2012-04-23 53 views
2

ファイルをftpサーバにアップロードしようとすると、エラーが発生します。サーバーはリモートサーバーですが、ftpアクセスを提供します。これは私が使用しているコードですjavaからftpサーバへファイルをアップロードする際のエラー

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package fileuploaddemo; 

import org.apache.commons.net.ftp.FTPClient; 
import java.io.FileInputStream; 
import java.io.IOException; 

public class FileUploadDemo { 
public static void main(String[] args) { 
    FTPClient client = new FTPClient(); 
    FileInputStream fis = null; 

    try { 
     client.connect("ftp.adress.comlu.com"); 
     client.login("username", "mypass"); 

     // 
     // Create an InputStream of the file to be uploaded 
     // 
     String filename = "D:/xxx/screen0.png"; 
     fis = new FileInputStream(filename); 

     // 
     // Store file to server 
     // 
     client.storeFile(filename, fis); 
     client.logout(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fis != null) { 
       fis.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

これはプログラムの出力です。何もアップロードされず、私が得るのはこれらの行だけです。

run: 
java.net.SocketException: Software caused connection abort: recv failed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:150) 
at java.net.SocketInputStream.read(SocketInputStream.java:121) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:154) 
at java.io.BufferedReader.read(BufferedReader.java:175) 
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58) 
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:310) 
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:290) 
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:479) 
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552) 
at org.apache.commons.net.ftp.FTP.port(FTP.java:877) 
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:709) 
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:565) 
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:557) 
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1795) 
at fileuploaddemo.FileUploadDemo.main(FileUploadDemo.java:29) 
BUILD SUCCESSFUL (total time: 1 second) 

何が問題なのですか?あなたが転送を開始する前に

答えて

0

解決済み:netsh advfirewall set global StatefulFTP disable管理者権限のコマンドプロンプトで。これは、Windowsマシン上のJava 7バグです。

5

は、

client.enterLocalPassiveMode() 

を試してみてください。私はあなたがデータ転送のためのPASVモードに入る必要があると思う。これは、ルータ(NAT)またはファイアウォールの背後にある場合に発生します。 FTPサーバーは、デフォルトでデータ接続のために接続しようとします。つまり、一部のポートでリッスンを開始し、サーバーに接続してデータの転送を要求します。しかし、ファイアウォールやルーターの背後にいる場合は、サーバーから直接接続することはできません。 PASVモードでは、代わりにFTPサーバーに転送のためにサーバー上のポートを開き、クライアントがそのポートに接続するように指示します。スタックトレースで

+0

サーバにファイルを保存しようとする前に行を追加したところ、java.net.SocketExceptionが返されました。接続のリセット –

+0

代わりにconnectを呼び出す前に呼び出す必要があると思います。 javadocをチェックしてみてくださいhttp://commons.apache.org/net/api-3.1/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode() –

+0

@Karuvägistajaあなたは新しいExceptionを投稿できますか?ファイアウォールの背後にいますか? –

0

1は、ファイルが、おそらくファイルを変更し、TEXT、BINARYない、として転送されることを見て、NULを扱うことができないなどの

client.type(FTP.BINARY_FILE_TYPE); 

しかし、特に@Kalは正しいです。

+0

それは変数FTPを見つけることができないとKalのソリューションは何も変更されていないと言います。 –

+0

FTPClient.BINARY_FILE_TYPEを使用できます。クラスFTPClientは、定数が定義されているFTPを拡張します。 Kalの解決策はうまくいかなかったことを申し訳ありません。あなたのコードが大丈夫だと思われるので、それは妥当と思われました。 –

+1

解決済み:netsh advfirewall set global StatefulFTP disable管理者権限のコマンドプロンプトで。これはWindowsマシン上のJava 7バグです –

関連する問題