考虑到以后可能用到这些代码,还是决定分享出来,方便以后查找参考。
1、上传文件
/**
* 上传文件到ftp.
*
* @param inputStream
* @param pathString
* @param filename
* @return
*/
public boolean uploadFile(ByteArrayInputStream inputStream, String pathString, String fileName) throws Exception {
boolean flag = false;
if (!initConnect()) {
return false;
}
try {
if (!existDirectory(pathString)) {
flag = createDirectory(pathString);
}
// 变更工作路径
flag = ftpClient.changeWorkingDirectory("/" + pathString);
// 存储文件
flag = ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1"), inputStream);
} catch (IOException e) {
e.printStackTrace();
// 失败后删除上传的文件
removeDirectory(pathString, new String(fileName.getBytes("GBK"), "iso-8859-1"));
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e2) {
}
}
}
return flag;
}
2、下载文件
/**
* 从Ftp上下载一个文件
*
* @param fileName
* @return InputStream
* @throws IOException
*/
public InputStream downloadFile(String remotePath, String fileName) {
InputStream is =null;
FTPFile[] fs;
try{
this.initConnect();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); <pre name="code" class="java"> // 转移到FTP服务器目录
ftpClient.changeWorkingDirectory("/"+remotePath);
//fs = ftpClient.listFiles();
//检查远程文件是否存在
fs = ftpClient.listFiles(new String(fileName.getBytes("GBK"),"iso-8859-1"));
if(fs.length == 1){
is = ftpClient.retrieveFileStream(new String(fileName.getBytes("GBK"),"iso-8859-1"));
return is;
}
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
3、删除文件
<pre name="code" class="html"> public boolean removeDirectory(String path, String fileName) throws IOException{
this.initConnect();
try {
// 获取当前Ftp服务器登录目录,主要是解决Linux下Ftp服务器删除附件问题
String curDirectory = ftpClient.printWorkingDirectory();
if (JqLib.isEmpty(curDirectory)) {// 若为空,则定位到根目录
curDirectory = "";
}
// 删除文件
boolean flag = ftpClient.changeWorkingDirectory(curDirectory + "/" + rootpath + "/" + path);// 转移到FTP服务器目录
flag = ftpClient.deleteFile(new String(fileName.getBytes("GBK"), "iso-8859-1"));
if (!flag) {
throw new UploadNotSuccessException("FTP附件删除失败!");
}
// 删除文件夹
flag = ftpClient.changeWorkingDirectory("/" + rootpath);
return ftpClient.removeDirectory(path);
} catch (IOException e) {
e.printStackTrace();
} finally {
this.closeConnect();
}
return true;
}
4、删除并备份文件(这里的删除实际是备份文件,将历史文件保存了下来,放在另外一个文件夹里面)
public boolean removeDirectory(String path, String fileName) throws IOException{
this.initConnect();
try {
boolean flag = false;
String ftpFileName = new String(fileName.getBytes("GBK"), "iso-8859-1");
// 获取当前Ftp服务器登录目录,主要是解决Linux下Ftp服务器删除附件问题
String curDirectory = ftpClient.printWorkingDirectory();
if (JqLib.isEmpty(curDirectory)) {// 若为空,则定位到根目录
curDirectory = "";
}
// 获得时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String datePrint = sdf.format(new Date());
// 拼接目录
String pathString = curDirectory + "/" + rootpath + "/" + path;
String pathStringTrash = curDirectory + "/" + rootpath_trash + "/" + path + "_" + datePrint;
if (!existDirectory(pathStringTrash) && testPath(pathString)) {
flag = ftpClient.makeDirectory(pathStringTrash);
}
// 源文件存在时才移动
if (testPath(pathString)) {
// 移动文件
flag = ftpClient.rename(pathString + "/" + ftpFileName, pathStringTrash + "/" + ftpFileName);
if (!flag) {
System.out.println("FTP附件移动失败");
}
// 删除文件夹
flag = ftpClient.changeWorkingDirectory("/" + rootpath);
}else{
System.out.println("源文件路径 " + path + "不存在");
}
return ftpClient.removeDirectory(path);
} catch (IOException e) {
e.printStackTrace();
} finally {
this.closeConnect();
}
return true;
}
5、其他相关方法
<pre name="code" class="java"> /**
* 连接参数初始化
*/
public boolean initConnect() {
try {
if (ftpClient == null) { // 如果为空,则初始化连接
if (!isConnectFtp()) {
return false;
}
} else { // 如果不为空,则定位到根目录
ftpClient.cwd("/"+rootpath);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 检查文件夹在当前目录下是否存在
*
* @param path 目录路径
* @return
* @throws IOException boolean
*/
public boolean existDirectory(String path) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftpClient.listFiles(path);
for (FTPFile ftpFile : ftpFileArr) {
if (ftpFile.isDirectory() && ftpFile.getName().equalsIgnoreCase(path)) {
flag = true;
break;
}
}
return flag;
}
/**
* 创建文件目录
*
* @param pathName 目录路径
* @return
* @throws IOException boolean
*/
public boolean createDirectory(String pathName) throws IOException {
String[] path = pathName.split("/");
FTPFile[] file = null;
for(int j=0;j<path.length;j++) {
try {
file = ftpClient.listFiles(path[j]);
if(file.length==0) {
throw new Exception();
}
}catch(Exception e) {
//不存在此目录
ftpClient.makeDirectory(path[j]);
}finally {
ftpClient.changeWorkingDirectory(path[j]);
}
}
return true;
}
/**
* 测试Ftp服务器是否联通
*
* @return boolean
*/
public boolean isConnectFtp() {
boolean isConnect = true;
ftpClient = new FTPClient();
int reply;
try {
if (this.port != -1) {
ftpClient.setDefaultPort(port);
} else {
ftpClient.connect(ip);
}
ftpClient.connect(ip);
ftpClient.login(this.username, this.password);
reply = ftpClient.getReplyCode();
ftpClient.setDataTimeout(120000);
//设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
//设置以二进制流的方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("UTF-8");
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
isConnect = false;
}
return isConnect;
} catch (SocketException e) {
isConnect = false;
e.printStackTrace();
} catch (IOException e) {
isConnect = false;
}
return isConnect;
}