java实现ftp文件操作的方式有哪些?
由于时间问题,这里尝试了两种方式:Apache组织提供的org.apache.commons.net.ftp、edtFTPj。
一、org.apache.commons.net.ftp
要使用org.apache.commons.net.ftp实现功能需要项目内引入commons-net-1.4.1.jar、jakarta-oro-2.0.8.jar(不引入此包, FTPClient.listFiles()会报错,具体原因没有细究,当然希望高手给予补充)。
1、可以留意一下checkDirectory方法,因为之前做的时候想做一个校验:“java判断指定文件夹是否存在,如果不存在就自动创建”。然后在网上找了以下三种方案:
①ftpClient.makeDirectory(目录地址); 返回结果true或false
②ftpClient.cd(dir); 通过异常控制,报异常则为无。
③用changeWorkingDirectory,返回 false 没有 true 是有 。
个人感觉上述方法都不靠谱,所以采用了遍历文件夹的方式进行验证,当然如果你ftp服务器上的目录太多,用这个方法最好慎重一下。
2、中文乱码解决采用的是:http://www.linuxidc.com/Linux/2014-10/107585.htm给出的解决方案。
package com.cf.mytest.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class ApacheFtp {
/** 本地字符编码 */
private static String LOCAL_CHARSET = "GBK";
// FTP协议里面,规定文件名编码为iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";
//检查ftp目录
public static boolean checkDirectory(FTPClient ftp, String dirName) {
boolean _flag = false;
try {
FTPFile[] files = ftp.listFiles();
for (int i = 0; i < files.length; i++) {
FTPFile file = files[i];
if (file.isDirectory()) {
if (dirName.equalsIgnoreCase(file.getName())) {
_flag = true;
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return _flag;
}
/**
* Description: 向FTP服务器上传文件
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static int uploadFile(String path, String filename, InputStream input) {
int success = 0;
//ftp连接参数
String ftpServer = "192.168.1.254";
int ftpPort = 21;
String ftpUser = "lmss";
String ftpPassword = "test123";
FTPClient ftp = new FTPClient();
try {
int reply;
// 连接FTP服务器
ftp.connect(ftpServer, ftpPort);
// 登录ftp
ftp.login(ftpUser, ftpPassword);
// 看返回的值是不是230,如果是,表示登陆成功
reply = ftp.getReplyCode();
// 以2开头的返回值就会为真
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
// 检查路径目录,没有就创建
path = StringUtils.removeStart(path, "/");
String[] typeArray = path.split("/");
for (int i = 0; i < typeArray.length; i++) {
if (!checkDirectory(ftp, typeArray[i])){
ftp.makeDirectory(typeArray[i]);
}
ftp.changeWorkingDirectory(typeArray[i]);
}
// 转到指定上传目录
// ftp.changeWorkingDirectory(path);
//设置每次读取文件流时缓存数组的大小
ftp.setBufferSize(1024);
//设置编码格式,解决中文乱码问题
if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
LOCAL_CHARSET = "UTF-8";
}
ftp.setControlEncoding(LOCAL_CHARSET);
// 设置文件类型(二进制)
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 将上传文件存储到指定目录
ftp.storeFile(new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET), input);
// 退出ftp
ftp.logout();
success = 1;
} catch (IOException e) {
e.printStackTrace();
} finally {
try{
if(input != null){
input.close();
}
if (ftp.isConnected()) {
ftp.disconnect();
}
}catch(Exception e){
e.printStackTrace();
}
}
return success;
}
/**
* Description: 删除ftp上的文件
* @return 成功返回true,否则返回false
*/
public static boolean deleteFileFtp(String path) {
boolean success = false;
//ftp连接参数
String ftpServer = "192.168.1.254";
int ftpPort = 21;
String ftpUser = "lmss";
String ftpPassword = "test123";
FTPClient ftp = new FTPClient();
try {
int reply;
// 连接FTP服务器
ftp.connect(ftpServer, ftpPort);
// 登录ftp
ftp.login(ftpUser, ftpPassword);
// 看返回的值是不是230,如果是,表示登陆成功
reply = ftp.getReplyCode();
// 以2开头的返回值就会为真
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
success = ftp.deleteFile(path);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
public static void main(String[] args) throws Exception {
File file = new File("d:\\3.png");
FileInputStream fis = new FileInputStream(file);
ApacheFtp.uploadFile("/resource/png","4.png",fis);
}
}
二、edtFTPj
要使用edtFTPj实现功能,项目需要引入edtftpj.jar。
package com.cf.mytest.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.commons.lang.StringUtils;
import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.net.ftp.FileTransferOutputStream;
public class EdtFTPjTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
File file = new File("d:\\3.png");
FileInputStream fis = new FileInputStream(file);
EdtFTPjTest.writeFileToFtp("resource/png","4.png",fis);
}
// 连接到ftp,创建文本目录,指定最后一级目录
public static FileTransferClient connect(String directory) {
FileTransferClient ftp = new FileTransferClient();
ftp.getAdvancedSettings().setControlEncoding("gb2312");
//ftp配置信息
String ftpServer = "192.168.1.254";
int ftpPort = 21;
String ftpUser = "lmss";
String ftpPassword = "test123";
try {
ftp.setRemoteHost(ftpServer);
ftp.setRemotePort(ftpPort);
ftp.setUserName(ftpUser);
ftp.setPassword(ftpPassword);
ftp.connect();
/*
* 循环创建文件夹目录
*/
//判断路径开始是否是/,如果是就删除掉
directory = StringUtils.removeStart(directory, "/");
String[] typeArray = directory.split("/");
for (int i = 0; i < typeArray.length; i++) {
if (!checkDirectory(ftp, typeArray[i]))
ftp.createDirectory(typeArray[i]);
ftp.changeDirectory(typeArray[i]);
}
} catch (Exception e) {
ftp = null;
e.printStackTrace();
}
return ftp;
}
// 更改ftp的路径
public static boolean checkDirectory(FileTransferClient ftp, String dirName) {
boolean _flag = false;
try {
FTPFile[] files = ftp.directoryList();
for (int i = 0; i < files.length; i++) {
if (files[i].isDir()) {
if (dirName.equalsIgnoreCase(files[i].getName())) {
_flag = true;
break;
}
}
}
} catch (Exception e) {
}
return _flag;
}
/*
* 写文件到ftp
* param: dec:文件所在目录,name:文件名称,in:输入流
*/
public static int writeFileToFtp(String dec, String name, InputStream in) {
int flag = 0;
FileTransferClient ftp = null;
FileTransferOutputStream output = null;
try {
//创建目录,指向最后一级目录
ftp = connect(dec);
//设置文件名
output = ftp.uploadStream(name);
byte[] buf = new byte[1024];
int hasRead=0;
while((hasRead=in.read(buf))>0){
output.write(buf, 0, hasRead);
}
output.flush();
flag = 1;
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(output != null){
output.close();
}
if(ftp!=null && ftp.isConnected()){
ftp.disconnect();
}
}catch(Exception e){
e.printStackTrace();
}
}
return flag;
}
}
以上代码,亲测好用!
所需jar文件如下:点击打开链接
最后希望各位大神能够给我指出代码中的缺陷,还有将来可能遇到的问题,多谢!

浙公网安备 33010602011771号