jdk1.7之后,ftp的更改使得之前版本的不能使用,而且网络上的基本都是1.6之前的,所以自己写了一个,仅供参考。
因为我的项目中只用到了上传和删除,所以这里就只提供上传删除的功能,需要的可以自己参考写出下载等功能!
说明:代码里面的所有读写删除等操作,需要你的FTP账号有相应的权限,否则执行错误还不知道错误在哪!
1.[代码]ftp上传和删除
package com.itv.launcher.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Properties;
import java.util.StringTokenizer;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpProtocolException;
/**
* FTP上传工具类
*
* @author yanzhou
* @version v1.0
*/
public class FTPUtil {
private static FtpClient ftpClient = null;
private static final String url;
private static final int port;
private static final String user;
private static final String password;
private static final String remoteFilePath;
static {
Properties FTPPro = ReadFTPProperties.getMsgFromPro();
url = FTPPro.getProperty("FTP_URL");
port = Integer.parseInt(FTPPro.getProperty("FTP_PORT"));
user = FTPPro.getProperty("FTP_USER");
password = FTPPro.getProperty("FTP_PASSWORD");
remoteFilePath = FTPPro.getProperty("FTP_REMOTE_FILEPATH");
}
/**
* 链接FTP
* @throws FtpProtocolException
*/
private static void connectFTP() throws FtpProtocolException {
try {
ftpClient = FtpClient.create();
ftpClient.connect(new InetSocketAddress(url, port));
ftpClient.login(user, password.toCharArray());
ftpClient.setBinaryType();
if (!"".equals(remoteFilePath) && remoteFilePath != null) {
ftpClient.changeDirectory(remoteFilePath);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 关闭FTP链接
*/
public static void closeFTP() {
try {
if (ftpClient != null) {
ftpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上传文件到FTP
* @param file file文件,struts2从页面得到的File类型
* @param filePath 要保存在FTP上的路径(文件夹)
* @param fileName 文件名(test001.jpg)
* @return 文件是否上传成功
* @throws Exception
*/
public static boolean upload(File file, String filePath, String fileName) {
TelnetOutputStream to = null;
FileInputStream fi = null;
filePath = remoteFilePath + Constants.FILE_SEPARATOR + filePath;
try {
if (file != null) {
connectFTP();
if (!isDirExist(filePath.replace("\\", "/"))) {
createDir(filePath.replace("\\", "/"));
ftpClient.changeDirectory(filePath.replace("\\", "/"));
}
fi = new FileInputStream(file);
to = (TelnetOutputStream) ftpClient.putFileStream(fileName, true);
byte[] bytes = new byte[1024];
int i = fi.read(bytes);
while (i != -1) {
to.write(bytes);
i = fi.read(bytes);
}
}
return true;
} catch (FileNotFoundException e1) {
return false;
} catch (IOException e2) {
return false;
}catch (Exception e) {
return false;
}finally {
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (to != null) {
try {
to.flush();
to.close();
} catch (IOException e) {
e.printStackTrace();
}
}
closeFTP();
}
}
/**
* 删除FTP制定目录下的文件
* @param filePath 文件在FTP存储的路径
* @param fileName 要删除的文件名称
* @return 是否删除成功
*/
public static boolean deleteFileFtp(String filePath, String fileName){
try{
connectFTP();
filePath = remoteFilePath + Constants.FILE_SEPARATOR + filePath + Constants.FILE_SEPARATOR;
if (!isDirExist(filePath.replace("\\", "/"))) {
return false;
}
ftpClient.changeDirectory(filePath.replace("\\", "/"));
ftpClient.deleteFile(fileName);
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}finally {
closeFTP();
}
}
/**
* 检查文件夹是否存在
*
* @param dir
* @param ftpClient
* @return
*/
private static Boolean isDirExist(String dir) {
try {
ftpClient.changeDirectory(dir);
} catch (Exception e) {
return false;
}
return true;
}
/**
* 创建文件夹
*
* @param dir
* @param ftpClient
* @throws Exception
*/
private static void createDir(String dir) throws Exception {
ftpClient.setAsciiType();
StringTokenizer s = new StringTokenizer(dir, "/"); // sign
s.countTokens();
String pathName = "";
while (s.hasMoreElements()) {
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpClient.makeDirectory(pathName);
} catch (Exception e) {
e = null;
}
}
ftpClient.setBinaryType();
}
}
2.[代码]常量类,系统的路径分隔符
package com.itv.launcher.util;
public interface Constants {
//路径分隔符
public static String FILE_SEPARATOR = System.getProperty("file.separator");
}
3.[代码]FTP链接的配置properties文件,包括用户名密码一些信息
#FTP的IP地址
FTP_URL=127.0.0.1
#FTP端口号
FTP_PORT=1234
#用户名
FTP_USER=yanzhou
#密码
FTP_PASSWORD=abcdefg12345
#FTP账号目录
FTP_REMOTE_FILEPATH=