9

I dont understand why cant javascript make ftp calls?. Why do we have to make such a request using server?

Even Browsers have ability to authenticate and browse a ftp server. Maybe use browser api's to do it?

6
  • have you looked into this question? stackoverflow.com/questions/5338444/… Commented Nov 21, 2014 at 16:51
  • Yes, but I know about window.open. My question is relating to JS network calls for FTP operations. Commented Nov 21, 2014 at 20:55
  • have you checked fireftp? github.com/mimecuvalo/fireftp Commented Nov 23, 2014 at 17:31
  • Yes, just did. It looks like a firefox plugin. Although it uses js files underneath, Im not sure how does it work, because its for Firefox only. So even if I consider this, any reason for my question why cant javascript make ftp calls ? I mean, we can do http calls using it.Ajax? Commented Nov 23, 2014 at 23:21
  • 1
    @JSON Please go ahead and edit it if you feel so. Commented Nov 24, 2014 at 19:24

4 Answers 4

9

Ok, answering my own question here.

I went through Mozilla docs on XMLHTTPRequest. It specifically says -

Despite its name, XMLHttpRequest can be used to retrieve any type of data, not just XML, and it supports protocols other than HTTP (including file and ftp).

So, I am satisfied with this. JavaScript can make calls to ftp using this.

Sign up to request clarification or add additional context in comments.

7 Comments

Yes, but there doesn't seem to be anyone who has written the code to do it.
Yes, and I guess the reasons can be read at the Differences from HTTP section on en.wikipedia.org/wiki/File_Transfer_Protocol
It would be magic to have full ftp in JS. It's a big task though. ipv4, ipv6, sftp, line endings, encoding, multiple protocol versions, file permissions. It's a complex protocol and I don't think it's possible unless there is a financial incentive
@Eddie What's avoiding such usage is same origin policy: XMLHttpRequest of whatever.thing cannot access to whatever.thing because the origin differ (schemes differ), and since ftp scheme is not HTTP, you have no way AFAIK to tell the browser the CORS is allowed. To make JS FTP-friendly, one would need to request FTP standard to allow CORS "headers" or so.
The mozilla docs have changed to specifically remove the part about "other protocols". Now just says Despite its name, XMLHttpRequest can be used to retrieve any type of data, not just XML.
|
2

The title of this question suggests the requester is keen on understanding if an FTP transfer could be implemented using JavaScript. However looking at the the answer by the same requester it appears that the question was just to know if URLs with FTP protocols can be used with JS and possibly HTML tags. The answer is yes. Even a simple <a> tag supports FTP URLs in the href attribute. Hope this helps the new readers. And yes, the XMLHttpRequest AJAX object does enable calling a URL with an FTP protocol.

Cheers.

2 Comments

The href tags work because the browser can open a ftp link. If the browsers couldn't, then I guess the <a> wouldn't work as well. Using XMLHTTPRequest, one can do an FTP transfer as well.
Firefox 88 just disabled ftp.
2

There is a JavaScript library at http://ftp.apixml.net/ that allows FTP file uploads via JavaScript.

In this case, technically, the ftpjs server is making the FTP connection to the FTP server, but the instructions are being passed via JavaScript. So this particular library is designed primarily to allow developers add a basic file upload mechanism without writing sever-side code.

Under the hood, it uses the HTML5 FileReader to read the file to a base64 string, and then posts this using CORS AJAX back to the server.

// Script from http://ftp.apixml.net/
// Copyright 2017 http://ftp.apixml.net/, DO NOT REMOVE THIS COPYRIGHT NOTICE
var Ftp = {
    createCORSRequest: function (method, url) {
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr) {
            // Check if the XMLHttpRequest object has a "withCredentials" property.
            // "withCredentials" only exists on XMLHTTPRequest2 objects.
            xhr.open(method, url, true);
        } else if (typeof XDomainRequest != "undefined") {
            // Otherwise, check if XDomainRequest.
            // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
            xhr = new XDomainRequest();
            xhr.open(method, url);
        } else {
            // Otherwise, CORS is not supported by the browser.
            xhr = null;
        }
        return xhr;
    },
    upload: function(token, files) {
        var file = files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.addEventListener("load",
            function() {
                var base64 = this.result;               
                var xhr = Ftp.createCORSRequest('POST', "http://ftp.apixml.net/upload.aspx");
                if (!xhr) {
                    throw new Error('CORS not supported');
                }
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        Ftp.callback(file);
                    }
                };
                xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xhr.send("token=" + token + "&data=" + encodeURIComponent(base64) + "&file=" + file.name);
            },
            false);
    },
    callback: function(){}
};

2 Comments

It has validation issues while generating token.
This Site asks you for all your credentials for generating the token. When you click generate it sends all your data in cleartext and over http to an backend: ftp.apixml.net/… Don't use this and if you did change your data now !
0

its very difficult to FTP data(BIGfile) to backup server without using HTTP protocol in a web application.

Lets say, S1-( Client Browser ), S2-(code container server), S3-(Files Backup server) and we want to upload 2gb file from s1 using FTP.

use case diagram

enter image description here

This can be done by "JavaApplet" . we can embed uploader applet in webapplication. This applet will run inside browser sand box.
go through link

sample code for ftp using applet

provided you have to enable java on your browser.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.