1. Explanation
To implement ftp in Java, you need to rely on the commons-net-3.3.jar package. First download the jar package. This thing is packaged and you can use it directly. Standing on the shoulders of giants to see the problem, you can also write the internal implementation by hand. . Commons-net-3.3.jar package download address http://download.csdn.net/download/qq_31634461/10034989
1.ftp upload and download tools
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
* ftp上传下载工具类
*/
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile (String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false ;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
ftp.login(username, password);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
String[] dirs = filePath.split("/" );
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "" .equals(dir)) continue ;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
ftp.enterLocalPassiveMode();
ftp.setFileType(FTP.BINARY_FILE_TYPE);
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true ;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
public static void main (String[] args) {
try {
FileInputStream in=new FileInputStream(new File("E:\\5.jpg" ));
boolean flag = uploadFile("IP地址" , 21 , "用户名" , "密码" , "home/www/images" ,"/2017/10/21" , "1.jpg" , in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
2. Download tools
/**
* Description: 从FTP服务器下载文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downloadFile (String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false ;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
ftp.login(username, password);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true ;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
2. Problem Analysis
1. If the connection is unsuccessful and the file cannot be created
Firewall, problem, whether to open port 21, and whether there is enough authority, assign 777 authority
2. The connection is successful, the file can be created, but the file cannot be uploaded
Add a line to the code
FTPClient.enterLocalPassiveMode ()
This method means that before each data connection, the ftp client tells the ftp server to open a port to transmit data.
3. After uploading the file, it is found that the file is garbled
Transmission format problem, add a line to the code ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//设置上传格式
4. Reprinting is prohibited without my consent