最近由于项目需要添加了上传文件到FTP服务器的功能,java上传文件到FTP服务器有多种实现,广泛被使用的有如下两种:一种是使用sun公司提供的sun.net.ftp包里面的FtpClient,另一种是Apache组织提供的org.apache.commons.net.ftp包里的FTPClient,今天就简单的介绍下第二种的java实现。
首先需要导入commons.net-3.2.jar,或者其他版本的该jar包亦可,然后创建一个FTP借口类:
public class Ftp {
private String ipAddr;//ip
private Integer port;//端口号
private String userName;//用户名
private String pwd;//密码
private String path;//上传路径
public Ftp(String ipAddr, Integer port, String userName, String pwd,
String path) {
this.ipAddr = ipAddr;
this.port = port;
this.userName = userName;
this.pwd = pwd;
this.path = path;
}
public String getIpAddr() {
return ipAddr;
}
public void setIpAddr(String ipAddr) {
this.ipAddr = ipAddr;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
,然后编写了一个工具类,来实现连接FTP服务器和上传文件的功能,如下所示:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUtil {
private static FTPClient ftp;
/**
* 获取ftp连接
*/
public static boolean connectFtp(Ftp f) throws Exception{
ftp=new FTPClient();
boolean flag=false;
ftp.connect(f.getIpAddr(),f.getPort());
ftp.login(f.getUserName(), f.getPwd());
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//设置缓冲区
ftp.setBufferSize(1024*1024);
int reply= ftp.getReplyCode();
System.out.println("getReplyCode:"+reply);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return flag;
}
createDir(f.getPath());
System.out.println("设置工作文件夹:"+ftp.changeWorkingDirectory("/"+f.getPath()));
flag = true;
return flag;
}
/**
* 创建文件夹
* @param dirname
*/
public static void createDir(String dirname){
try{
ftp.makeDirectory(dirname);
System.out.println("在目标服务器上成功建立了文件夹: " + dirname);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
/**
* 关闭ftp连接
*/
public static void closeFtp(){
if (ftp!=null && ftp.isConnected()) {
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* ftp上传文件
* @param f表示上传文件,fileName表示生成文件名
*/
public static void upload(File f,String fileName) throws Exception{
File sourcefile=new File(f.getPath());
FileInputStream input=new FileInputStream(sourcefile);
ftp.storeFile(fileName,input);
input.close();
}
// public static void main(String[] args) throws Exception{
// Ftp f=new Ftp("192.168.0.106", 21, "sealAdmin", "123", "images");
// FtpUtil.connectFtp(f);
// File file = new File("D:/images/shamo2.jpg");
// FtpUtil.upload(file,"new.jpg");//把文件上传在ftp上
// FtpUtil.closeFtp();
// }
}
其中connectFtp方法负责实现连接服务器功能,ftp.connect(f.getIpAddr(),f.getPort())连接ip和端口,ftp.login(f.getUserName(), f.getPwd());登录,一般情况下这些数据正确填写的情况下,可以正常连接到ftp,ftp.getReplyCode()获得连接返回值,具体的返回值可以上网查询或查看源文件比对,200-300的返回值都是连接成功的标志,createDir(f.getPath())主要实现创建ftp上传的路径,如果该路径第一次上传时不存在则去调用 ftp.makeDirectory(dirname)创建该文件路径,如果已存在则不再创建;ftp.changeWorkingDirectory("/"+f.getPath())是设置上传存储的路径,比如我测试输入的是images,则上传到ftp服务器
时会自动创建一级文件夹images,然后上传的文件都被传到images文件夹下,可以根据需要来写文件夹如images/myupload/picture,这样就会创建三级文件夹;ftp.setBufferSize(1024*1024)是设置缓冲区,这个会影响上传速度,如果不设置的话,一般默认1kb/s或者其他较低的上传速度,我这里根据网路带宽设置了比较合适的速度来提高上传效率。
其中另一个比较重要的方法就是upload(File f,String fileName),该方法接受一个File变量,f表示上传文件,fileName表示生成的文件名(包括后缀名),这样你就可以随意新建上传后的文件名。
这里只介绍了上传方法,如需要其他方法,比如上传文件夹或者下载文件或下载整个文件夹可以自行添加实现。