JavaはFTPファイルのアップロードを実現します。


一、FTPファイルサーバの設定
Ubuntuを例にして
FTPの2種類のモードの簡単な紹介
PORT(アクティブモード)
第1のステップFTPクライアントは、まず、1024より大きいポートp 1をランダムに選択し、このポート送信要求を介してFTPサーバの21番目のポートに接続してTCP接続を確立し、FTPではこの接続を制御接続といい、接続が成功したら、FTPクライアントは、ポートポートポートポートを送信し、FTPクライアントは、自分のp 1+1ポートを監視します。FTPサーバは、ポートポートポート20からFTPクライアントのp 1+1ポートに対して、データを送信するためのTCP接続と呼ばれる接続を開始します。データ転送が完了すると、データ接続が終了し、制御接続がオープンします。
Passive(受動モード)
制御接続を確立するときはアクティブモードと似ていますが、接続を確立した後に送信されるのはポートコマンドではなく、Pasvコマンドです。FTPサーバは、Pasvコマンドを受信した後、ランダムに一時ポートを開きます。(自由ポートともいいます。ポート番号は1023より65535未満です。)、このポートでデータを転送する要求をクライアントに通知します。FTPクライアントは、FTPサーバに接続することを要求するポートを送信します。接続の確立に成功したFTPサーバは、このポートを通じてデータの転送データを転送した後、データ接続をすぐにオフにし、制御コネクションをオンにします。
注!!!多くのファイアウォールは設定時に外部からの接続を許可しないので、ファイアウォールの後やイントラネットの後にあるFTPクライアントはアクティブモードをサポートしていません。サーバーがファイアウォールを通過できないか、またはNAT後のクライアントに接続できないためです。だからファイルをアップロードする時はパッシブモードを開く必要があります!!!
1、vsftpdをインストールするapt-get install vsftpd2、配置vs ftpdvi /etc/vsftpd.conf以下はvsftpd配置の詳細です。
(1)、コア配置

 local_enable=YES   //        
 write_enable=YES  //        
 local_umask=022   //  FTP       ,   077,     022
 pam_service_name=vsftpd  //    
 connect_from_port_20=YES //  FTP         
 listen=yes            //     FTP    
 listen_port=23        //      
(2)、匿名登録設定

 anonymous_enable=NO		//        ,     
 anon_upload_enable=YES       //         ,          
 anon_mkdir_write_enable=YES  //        ,                     
 anon_other_write_enable=yes  //         ,            
 anon_world_readable_only=no   //        ,       ,   Other,     /      
 anon_max_rate=30000          //         ,          ,  bite
(3)、ログイン制限

userlist_enable=yes     // userlist       
userlist_deny=no        //          
userlist_file=/etc/vsftpd/userlist_deny.chroot    //           
(4)、制限ディレクトリ

 chroot_local_user=yes  //           
 chroot_list_enable=YES  //             
 chroot_list_file=/etc/vsftpd/chroot_list  //               
(5)、ログ設定

 xferlog_file=/var/log/vsftpd.log  //        
 xferlog_std_format=YES    //          
(6)、安全設定

idle_session_timeout=600 //      ,   
data_connection_timeout=120  //        ,   
accept_timeout=60   //      1     
local_max_rate=10000 //        ,  bite
max_clients=100     //FTP      
max_per_ip= 3     // IP      
(7)、受動モード設定

  pasv_enable=yes    //        
  pasv_min_port=3000  //         
  pasv_max_port=5000 //        
実は一部を配置すればファイルをアップロードできます。
write_enable=YES放せばいいです。
このパッシブモードで一日やっていますが、いつも写真が届かなくて、伝わっても0 kbしかないです。原因がまだ分かりません。えっと、
3、起動サービスを再開するservice vsftpd restart4、ログイン

二、javaファイルをFTPにアップロードする
簡単なファイルをアップロードします。

/**
     * Description:  FTP       
     * @param host FTP   hostname
     * @param port FTP     
     * @param username FTP    
     * @param password FTP    
     * @param basePath FTP       
     * @param filePath FTP         。       :/2018/01/01。      basePath+filePath
     * @param filename    FTP        
     * @param input    
     * @return     true,    false
     */
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                                     String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            //   FTP   //         ,    ftp.connect(host)       FTP   
            ftp.connect(host, port);
            //   
            ftp.login(username, password);
            reply = ftp.getReplyCode();   //     
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();        //    
                return result;           //             
            }
            //           
            ftp.enterLocalPassiveMode();
            //       
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                //           
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //               
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //       true    false
            if (!ftp.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * Description:  FTP       
     * @param host FTP   hostname
     * @param port FTP     
     * @param username FTP    
     * @param password FTP    
     * @param remotePath FTP         
     * @param fileName        
     * @param localPath            
     * @return
     */
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                                       String fileName, String localPath) {
        boolean result = false;
        //    
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            //     //         ,    ftp.connect(host)       FTP   
            ftp.connect(host, port);
            //   
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //           
            ftp.enterLocalPassiveMode();
            ftp.changeWorkingDirectory(remotePath);//    FTP     
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + "/" + ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
テストクラス

InputStream inputStream = new FileInputStream(new File("D:/mine/x.jpg"));
//uuid                 uuid      
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
FTPTools.uploadFile("192.168.1.242",21,"q","q","/home/q/","/",uuid+"       ",inputStream);
Apacheの原生ftp。。。。ftpに接続していますが、ファイルのアップロードが成功していません。十中八九Vsftpdの配置に問題があります。
以上はJavaがFTPファイルのアップロードを実現した詳細です。Java FTPファイルのアップロードに関する資料は他の関連記事に注目してください。