A lightweight, simple FTP server. Pure Java, no libraries.
Although it's named "minimal", it supports a bunch of features:
- 100% Java, no libraries
- Lightweight
- Supports 57 FTP commands
- TLS/SSL support
- Custom File System support
- Custom User Authentication support
- Custom Commands support
- Support to obsolete commands (some FTP clients might still use them)
The required minimum implementation is already done, however, there are still commands that can be implemented.
- RFC 959 - File Transfer Protocol (33/33)
- RFC 697 - CWD Command of FTP (1/1) (Obsolete)
- RFC 737 - FTP Extension: XSEN (0/3) (Obsolete)
- RFC 743 - FTP extension: XRSQ/XRCP (0/4) (Obsolete)
- RFC 775 - Directory oriented FTP commands (5/5) (Obsolete)
- RFC 1123 - Requirements for Internet Hosts
- RFC 1639 - FTP Operation Over Big Address Records (2/2) (Obsolete)
- RFC 2228 - FTP Security Extensions (3/8)
- RFC 2389 - Feature negotiation mechanism for the File Transfer Protocol (2/2)
- RFC 2428 - FTP Extensions for IPv6 and NATs (2/2)
- RFC 2640 - Internationalization of the File Transfer Protocol (0/1)
- RFC 2773 - Encryption using KEA and SKIPJACK (0/1)
- RFC 3659 - Extensions to FTP (4/4)
- RFC 4217 - Securing FTP with TLS
- RFC 5797 - FTP Command and Extension Registry
- RFC 7151 - File Transfer Protocol HOST Command for Virtual Hosts (1/1)
- draft-twine-ftpmd5-00 - The "MD5" and "MMD5" FTP Command Extensions (2/2) (Obsolete)
- draft-somers-ftp-mfxx-04 - The "MFMT", "MFCT", and "MFF" Command Extensions for FTP (1/3)
- draft-bryan-ftpext-hash-02 - File Transfer Protocol HASH Command for Cryptographic Hashes (1/1)
- draft-bryan-ftp-range-08 - File Transfer Protocol RANG Command for Octet Ranges (0/1)
MinimalFTP is published on JCenter and Maven Central
<dependency>
<groupId>com.guichaguri</groupId>
<artifactId>minimalftp</artifactId>
<version>1.0.6</version>
<type>pom</type>
</dependency>
compile 'com.guichaguri:minimalftp:1.0.6'
<dependency org='com.guichaguri' name='minimalftp' rev='1.0.6'>
<artifact name='minimalftp' ext='pom' />
</dependency>
Check out more examples here :)
// Uses the current working directory as the root
File root = new File(System.getProperty("user.dir"));
// Creates a native file system
NativeFileSystem fs = new NativeFileSystem(root);
// Creates a noop authenticator, which allows anonymous authentication
NoOpAuthenticator auth = new NoOpAuthenticator(fs);
// Creates the server with the authenticator
FTPServer server = new FTPServer(auth);
// Start listening synchronously
server.listenSync(21);