3

Apache FTP サーバーをアプリケーションに統合しようとしています。ここに記載されている手順に従いましたが、いくつかの問題が発生しました。現在、サーバーを実行してブラウザから接続できますが、ログインできません。admin/admin と anonymous/* を試しましたが、毎回ログインに失敗します。私がダウンロードした apache-ftpserver-1.0.6 ソース コードでは、ユーザー マネージャーに関連付けられているファイルは res/conf にありますが、自分のプログラムでそのファイル パスを一致させようとすると、「無効です」というエラーが表示されます。リソース ディレクトリ名」と表示され、ビルドできません。また、ファイル users.properties と ftpd-typ.xml をメインに直接含めてみて実行できますが、再びログインできません。私のプロジェクトはこれらのファイルが存在することを認識していないようです。

サーバーにログインできるようにこれらのファイルを含める正しい方法を教えてくれるApache FTPサーバーの経験がある人はいますか?

ありがとう!

PS 違いはないと思いますが、私はこのプログラムを Android 用に開発しています。

4

1 に答える 1

4

次のコードでは、管理者ユーザーと非管理者ユーザーを作成し、読み取り、書き込みの制限を設定し、スロットリングとアップロード レート制限を制限し、ダウンロード レート制限を課しています。

ユーザーのログインとログアウトのダウンロード開始イベントとダウンロード終了イベントをリッスンするリスナーが追加されました。

 import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;

    import org.apache.ftpserver.FtpServer;
    import org.apache.ftpserver.FtpServerFactory;
    import org.apache.ftpserver.ftplet.Authority;
    import org.apache.ftpserver.ftplet.FileSystemFactory;
    import org.apache.ftpserver.ftplet.FtpException;
    import org.apache.ftpserver.ftplet.Ftplet;
    import org.apache.ftpserver.ftplet.UserManager;
    import org.apache.ftpserver.ftpletcontainer.impl.DefaultFtpletContainer;
    import org.apache.ftpserver.listener.ListenerFactory;
    import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
    import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor;
    import org.apache.ftpserver.usermanager.impl.BaseUser;
    import org.apache.ftpserver.usermanager.impl.ConcurrentLoginPermission;
    import org.apache.ftpserver.usermanager.impl.TransferRatePermission;
    import org.apache.ftpserver.usermanager.impl.WritePermission;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class SFTPServer {

        // ===========================================================
        // Constants
        // ===========================================================
        private final int FTP_PORT = 2221;
        private final String DEFAULT_LISTENER = "default";
        // private final Logger LOG = LoggerFactory.getLogger(SFTPServer.class);
        private static final List<Authority> ADMIN_AUTHORITIES;
        private static final int BYTES_PER_KB = 1024;
        private static final String DEFAULT_USER_DIR = "C:\\upload";

        public final static int MAX_CONCURRENT_LOGINS = 1;
        public final static int MAX_CONCURRENT_LOGINS_PER_IP = 1;

        // ===========================================================
        // Fields
        // ===========================================================
        private static FtpServer mFTPServer;
        private static UserManager mUserManager;
        private static FtpServerFactory mFTPServerFactory;
        private ListenerFactory mListenerFactor;

        // ===========================================================
        // Constructors
        // ===========================================================
        static {
            // Admin Authorities
            ADMIN_AUTHORITIES = new ArrayList<Authority>();
            ADMIN_AUTHORITIES.add(new WritePermission());
            ADMIN_AUTHORITIES.add(new ConcurrentLoginPermission(MAX_CONCURRENT_LOGINS, MAX_CONCURRENT_LOGINS_PER_IP));
            ADMIN_AUTHORITIES.add(new TransferRatePermission(Integer.MAX_VALUE, Integer.MAX_VALUE));
        }

        // ===========================================================
        // Getter & Setter
        // ===========================================================

        // ===========================================================
        // Methods for/from SuperClass/Interfaces
        // ===========================================================

        // ===========================================================
        // Methods
        // ===========================================================
        public void init() throws FtpException {
            mFTPServerFactory = new FtpServerFactory();
            mListenerFactor = new ListenerFactory();
            mListenerFactor.setPort(FTP_PORT);

            mFTPServerFactory.addListener(DEFAULT_LISTENER, mListenerFactor.createListener());
            mFTPServerFactory.getFtplets().put(FTPLetImpl.class.getName(), new FTPLetImpl());

            PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
            userManagerFactory.setFile(new File("ftpusers.properties"));
            userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());
            mUserManager = userManagerFactory.createUserManager();
            mFTPServerFactory.setUserManager(mUserManager);

            this.createAdminUser();
            SFTPServer.addUser("admin1", "admin1", 20, 20);

            mFTPServer = mFTPServerFactory.createServer();

            mFTPServer.start();
        }

        private UserManager createAdminUser() throws FtpException {
            UserManager userManager = mFTPServerFactory.getUserManager();
            String adminName = userManager.getAdminName();

            if (!userManager.doesExist(adminName)) {
                // LOG.info((new
                // StringBuilder()).append("Creating user : ").append(adminName).toString());
                BaseUser adminUser = new BaseUser();
                adminUser.setName(adminName);
                adminUser.setPassword(adminName);
                adminUser.setEnabled(true);
                adminUser.setAuthorities(ADMIN_AUTHORITIES);
                adminUser.setHomeDirectory(DEFAULT_USER_DIR);
                adminUser.setMaxIdleTime(0);
                userManager.save(adminUser);
            }

            return userManager;
        }

        public static void addUser(String username, String password, int uploadRateKB, int downloadRateKB) throws FtpException {

            BaseUser user = new BaseUser();
            user.setName(username);
            user.setPassword(password);
            user.setHomeDirectory(DEFAULT_USER_DIR);
            user.setEnabled(true);

            List<Authority> list = new ArrayList<Authority>();
            list.add(new TransferRatePermission(downloadRateKB * BYTES_PER_KB, uploadRateKB * BYTES_PER_KB)); // 20KB
            list.add(new ConcurrentLoginPermission(MAX_CONCURRENT_LOGINS, MAX_CONCURRENT_LOGINS_PER_IP));

            user.setAuthorities(list);

            mFTPServerFactory.getUserManager().save(user);
        }

        public static void restartFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.stop();
                try {
                    Thread.sleep(1000 * 3);
                } catch (InterruptedException e) {
                }
                mFTPServer.start();
            }
        }

        public static void stopFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.stop();
            }
        }

        public static void pauseFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.suspend();
            }
        }

        public static void resumeFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.resume();
            }
        }

        public static void main(String... are) {
            try {
                new SFTPServer().init();
            } catch (FtpException e) {
                e.printStackTrace();
            }
        }
        // ===========================================================
        // Inner and Anonymous Classes
        // ===========================================================

    }

FTPLET リスナー

import java.io.IOException;

import org.apache.ftpserver.ftplet.DefaultFtplet;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.FtpRequest;
import org.apache.ftpserver.ftplet.FtpSession;
import org.apache.ftpserver.ftplet.FtpletResult;

public class FTPLetImpl extends DefaultFtplet {

    @Override
    public FtpletResult onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Logged in");
        return super.onLogin(session, request);
    }

    @Override
    public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Disconnected");
        return super.onDisconnect(session);
    }

    @Override
    public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Started Downloading File " + request.getArgument());
        return super.onDownloadStart(session, request);
    }

    @Override
    public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println("Finished Downloading " + request.getArgument());
        return super.onDownloadEnd(session, request);
    }

}

FTP への接続

于 2013-10-15T05:49:31.673 に答える