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
027 import org.apache.commons.net.PrintCommandListener;
028 import org.apache.commons.net.ftp.FTP;
029 import org.apache.commons.net.ftp.FTPClient;
030 import org.apache.commons.net.ftp.FTPConnectionClosedException;
031 import org.apache.commons.net.ftp.FTPReply;
032
033 /***
034 * This is an example program demonstrating how to use the FTPClient class.
035 * This program connects to an FTP server and retrieves the specified
036 * file. If the -s flag is used, it stores the local file at the FTP server.
037 * Just so you can see what's happening, all reply strings are printed.
038 * If the -b flag is used, a binary transfer is assumed (default is ASCII).
039 * <p>
040 * Usage: ftp [-s] [-b] <hostname> <username> <password> <remote file> <local file>
041 * <p>
042 ***/
043 public final class FTPExample
044 {
045
046 public static final String USAGE =
047 "Usage: ftp [-s] [-b] <hostname> <username> <password> <remote file> <local file>\n" +
048 "\nDefault behavior is to download a file and use ASCII transfer mode.\n" +
049 "\t-s store file on server (upload)\n" +
050 "\t-b use binary transfer mode\n";
051
052 public static final void main(String[] args)
053 {
054 int base = 0;
055 boolean storeFile = false, binaryTransfer = false, error = false;
056 String server, username, password, remote, local;
057 FTPClient ftp;
058
059 for (base = 0; base < args.length; base++)
060 {
061 if (args[base].startsWith("-s"))
062 storeFile = true;
063 else if (args[base].startsWith("-b"))
064 binaryTransfer = true;
065 else
066 break;
067 }
068
069 if ((args.length - base) != 5)
070 {
071 System.err.println(USAGE);
072 System.exit(1);
073 }
074
075 server = args[base++];
076 username = args[base++];
077 password = args[base++];
078 remote = args[base++];
079 local = args[base];
080
081 ftp = new FTPClient();
082 ftp.addProtocolCommandListener(new PrintCommandListener(
083 new PrintWriter(System.out)));
084
085 try
086 {
087 int reply;
088 ftp.connect(server);
089 System.out.println("Connected to " + server + ".");
090
091 // After connection attempt, you should check the reply code to verify
092 // success.
093 reply = ftp.getReplyCode();
094
095 if (!FTPReply.isPositiveCompletion(reply))
096 {
097 ftp.disconnect();
098 System.err.println("FTP server refused connection.");
099 System.exit(1);
100 }
101 }
102 catch (IOException e)
103 {
104 if (ftp.isConnected())
105 {
106 try
107 {
108 ftp.disconnect();
109 }
110 catch (IOException f)
111 {
112 // do nothing
113 }
114 }
115 System.err.println("Could not connect to server.");
116 e.printStackTrace();
117 System.exit(1);
118 }
119
120 __main:
121 try
122 {
123 if (!ftp.login(username, password))
124 {
125 ftp.logout();
126 error = true;
127 break __main;
128 }
129
130 System.out.println("Remote system is " + ftp.getSystemName());
131
132 if (binaryTransfer)
133 ftp.setFileType(FTP.BINARY_FILE_TYPE);
134
135 // Use passive mode as default because most of us are
136 // behind firewalls these days.
137 ftp.enterLocalPassiveMode();
138
139 if (storeFile)
140 {
141 InputStream input;
142
143 input = new FileInputStream(local);
144
145 ftp.storeFile(remote, input);
146
147 input.close();
148 }
149 else
150 {
151 OutputStream output;
152
153 output = new FileOutputStream(local);
154
155 ftp.retrieveFile(remote, output);
156
157 output.close();
158 }
159
160 ftp.logout();
161 }
162 catch (FTPConnectionClosedException e)
163 {
164 error = true;
165 System.err.println("Server closed connection.");
166 e.printStackTrace();
167 }
168 catch (IOException e)
169 {
170 error = true;
171 e.printStackTrace();
172 }
173 finally
174 {
175 if (ftp.isConnected())
176 {
177 try
178 {
179 ftp.disconnect();
180 }
181 catch (IOException f)
182 {
183 // do nothing
184 }
185 }
186 }
187
188 System.exit(error ? 1 : 0);
189 } // end main
190
191 }
192