Does Google App Engine support ftp?

2020-02-06 06:51发布

问题:

Now I use my own Java FTP program to ftp objects from my PC to my ISP's website server.

I want to use Google App Engine's servlet to get Paypal IPN messages, then store the messages into my own objects and ftp the objects to my ISP's website server, is this doable ? I heard Google App Engine doesn't support FTP.

I don't expect Google to do it for me, but can I use my own Java FTP program in the web app that I upload onto the App Engine to do it ?

Frank

回答1:

No, you can't open any socket connection except by using URL Fetch service on HTTP/HTTPS to these port ranges:

80-90, 440-450, 1024-65535.



回答2:

As of April 9 this year (SDK 1.7.7) this isn't a problem any longer. Outbound sockets (e.g. FTP) are generally available to all billing-enabled apps.

Socket API Overview (Java): https://developers.google.com/appengine/docs/java/sockets/



回答3:

UPDATE: Our code below may no longer work. This FTP code worked for us before but we see a comment now below that says FTP is no longer supported on App Engine. See the link below. If you try this code and it works or doesn't work for you for straight FTP (TLS is NOT supported BTW) - please comment.


Yes. FTP now works on Google App Engine. (The accepted answer is outdated and no longer true.)

Here is tested and working code on GAE.

#!/usr/bin/env python
from google.appengine.ext import webapp
from ftplib import FTP

class HwHandler(webapp.RequestHandler):
                 def get(self):
                   self.response.out.write('FTP Starting...<br>')
                   ftp = FTP('ftp_site.com') 
                   ftp.login('login', 'password')
                   ftp.retrlines('LIST')  # list directory contents
                   self.response.out.write('FTP opened')
                   ftp.quit()

app = webapp.WSGIApplication([
    ('/', HwHandler)
 ], debug=True)

Of note, FTP TLS does not appear to work currently. (Trying to do "from ftplib import FTP_TLS" fails.)



回答4:

You can use the Apache Commons FTP client (org.apache.commons.net.ftp.FTPClient) if you put it into passive mode. Just do the following:

    FTPClient client = new FTPClient();
    client.connect(FTP_HOST);
    client.enterLocalPassiveMode();

Then it won't call ServerSocketFactory, and life should be good!