001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package examples;
019    
020    import java.io.FileInputStream;
021    import java.io.FileOutputStream;
022    import java.io.IOException;
023    import java.io.InputStream;
024    import java.io.OutputStream;
025    import java.io.PrintWriter;
026    import java.security.NoSuchAlgorithmException;
027    
028    import org.apache.commons.net.PrintCommandListener;
029    import org.apache.commons.net.ftp.FTP;
030    import org.apache.commons.net.ftp.FTPConnectionClosedException;
031    import org.apache.commons.net.ftp.FTPReply;
032    import org.apache.commons.net.ftp.FTPSClient;
033    
034    /***
035     * This is an example program demonstrating how to use the FTPSClient class.
036     * This program connects to an FTP server and retrieves the specified
037     * file.  If the -s flag is used, it stores the local file at the FTP server.
038     * Just so you can see what's happening, all reply strings are printed.
039     * If the -b flag is used, a binary transfer is assumed (default is ASCII).
040     * <p>
041     * Usage: ftp [-s] [-b] <hostname> <username> <password> <remote file> <local file>
042     * <p>
043     ***/
044    public final class FTPSExample
045    {
046    
047        public static final String USAGE =
048            "Usage: ftp [-s] [-b] <hostname> <username> <password> <remote file> <local file>\n" +
049            "\nDefault behavior is to download a file and use ASCII transfer mode.\n" +
050            "\t-s store file on server (upload)\n" +
051            "\t-b use binary transfer mode\n";
052    
053        public static final void main(String[] args) throws NoSuchAlgorithmException
054        {
055            int base = 0;
056            boolean storeFile = false, binaryTransfer = false, error = false;
057            String server, username, password, remote, local;
058            String protocol = "SSL";    // SSL/TLS
059            FTPSClient ftps;
060            
061            for (base = 0; base < args.length; base++)
062            {
063                if (args[base].startsWith("-s"))
064                    storeFile = true;
065                else if (args[base].startsWith("-b"))
066                    binaryTransfer = true;
067                else
068                    break;
069            }
070    
071            if ((args.length - base) != 5)
072            {
073                System.err.println(USAGE);
074                System.exit(1);
075            }
076    
077            server = args[base++];
078            username = args[base++];
079            password = args[base++];
080            remote = args[base++];
081            local = args[base];
082    
083            ftps = new FTPSClient(protocol);
084           
085            ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
086    
087            try
088            {
089                int reply;
090    
091                ftps.connect(server);
092                System.out.println("Connected to " + server + ".");
093    
094                // After connection attempt, you should check the reply code to verify
095                // success.
096                reply = ftps.getReplyCode();
097    
098                if (!FTPReply.isPositiveCompletion(reply))
099                {
100                    ftps.disconnect();
101                    System.err.println("FTP server refused connection.");
102                    System.exit(1);
103                }
104            }
105            catch (IOException e)
106            {
107                if (ftps.isConnected())
108                {
109                    try
110                    {
111                        ftps.disconnect();
112                    }
113                    catch (IOException f)
114                    {
115                        // do nothing
116                    }
117                }
118                System.err.println("Could not connect to server.");
119                e.printStackTrace();
120                System.exit(1);
121            }
122    
123    __main:
124            try
125            {
126                ftps.setBufferSize(1000);
127    
128                if (!ftps.login(username, password))
129                {
130                    ftps.logout();
131                    error = true;
132                    break __main;
133                }
134    
135                
136                System.out.println("Remote system is " + ftps.getSystemName());
137    
138                if (binaryTransfer) ftps.setFileType(FTP.BINARY_FILE_TYPE);
139    
140                // Use passive mode as default because most of us are
141                // behind firewalls these days.
142                ftps.enterLocalPassiveMode();
143    
144                if (storeFile)
145                {
146                    InputStream input;
147    
148                    input = new FileInputStream(local);
149    
150                    ftps.storeFile(remote, input);
151    
152                    input.close();
153                }
154                else
155                {
156                    OutputStream output;
157    
158                    output = new FileOutputStream(local);
159    
160                    ftps.retrieveFile(remote, output);
161    
162                    output.close();
163                }
164    
165                ftps.logout();
166            }
167            catch (FTPConnectionClosedException e)
168            {
169                error = true;
170                System.err.println("Server closed connection.");
171                e.printStackTrace();
172            }
173            catch (IOException e)
174            {
175                error = true;
176                e.printStackTrace();
177            }
178            finally
179            {
180                if (ftps.isConnected())
181                {
182                    try
183                    {
184                        ftps.disconnect();
185                    }
186                    catch (IOException f)
187                    {
188                        // do nothing
189                    }
190                }
191            }
192    
193            System.exit(error ? 1 : 0);
194        } // end main
195    
196    }