Skip to content


Subversion checkout URL

You can clone with
Download ZIP
node.js FTP Server
Tree: c3578bac74

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


nodeftpd - a simple FTP server written in Node.JS


This is turning out to be quite a deviation from the original code. Figured that if there's a need for an ftp server written in node.js, one probably needs to tack on custom functionality, otherwise they'd just use vsftpd. So my goal is to lay the groundwork for a basic FTP server, with all the right hooks in place for customizing operations.

I assume you'll want to customize:

  • User authentication (user and pass commands)
  • Where on the filesystem file commands operate
  • What happens when certain file commands are performed

For our special case we needed custom user authentication, to sandbox all the file operations, and to run special code when a file is uploaded.

Thanks, Alan


Known issues

  • Still many places that should be paying attention to the asynchronous nature of I/O ... LIST, STOR, etc ... LIST is fixed now, but I'm going to fix the others before pushing
  • Still some quirkiness with data connections ... namely with long-running sessions

These are known to work (or mostly work)

  • Passive data connection establishment
  • Non-passive data connection establishment
  • CWD (change working directory)
  • DELE (delete file)
  • LIST (had to construct the list format programmatically because output from ls -l wasn't being processed by FireFTP)
  • MKD (make directory)
  • STOR (upload)

If a command is not listed, I probably haven't tested it yet.

How to use

See test.js for an example.

Then implement the following event callbacks with logic you need performed:

  • command:pass - Sends three params. The first is the password. The second is a callback to be called if you determine the password is correct. Call the second if incorrect.
  • command:user - Same as command:pass above, but first parameter is the username that was sent from the client.

04 September 2011

Tested passive and non-passive data connections and found some issues, so I did some re-working.

Some things that might be nice:

  • Figure out how it should be run, maybe as root first but execs to another user
  • Fork new process when client connects and authenticates

Old Readme Follows ...

28 March 2010

Forked from Andrew Johnston -

Andrew's initial release was tested about node.js 0.1.21 In the few short months since that release, node.js has changed quite a bit to where it is now, at time of writing 0.1.33

Changes made to nodeftp are as follows:

  1. POSIX module has now been moved to FS (0.1.29)
  2. File module has been removed (0.1.29)
  3. sys.exec callback system seems to have changed??
    • as such quite a lot of moving about and rehacking had to take place:
    • DEL
    • STOR
    • RETR
    • RNTO
  4. tcp has changed function names and listeners
  5. Rewrote ftptest.js as well
  6. Changed ports to 7001/7002 so I can test without being root
  7. Finally. Reformatted for my Emacs and javascript-mode

Also, not tested in Passive mode yet, but I think it works??

One thing I had problems with was the root filesystem of the FTP server. Even though I was running the ftpd.js from /home/rob/workspace it changed it to "/". This meant that if I tried to get the SIZE of a file, eg: /home/rob/workspace/file.txt it tried to get the SIZE of /home/rob/workspace//home/rob/workspace/file.txt I narrowed this down to the dummyfs.js functionality, but then if I changed the dummyfs root there was repeating of the path names


  • Fix the repeating file paths problem
  • Add in non-anonymous logins
  • Implement non-implemented functionality (see ftpd.js TODO list)
  • Add in proper error checking
  • Test in passive mode

20 June 2010

Updated for node v0.1.98

Something went wrong with that request. Please try again.