环境介绍:我使用的是IDEA和maven开发的,源码以上传github了大家可以自行下载点击下载,下面具体介绍,写程序之前参考上一节内容,务必先新建好FTP服务器
1、使用的依赖,大家可以先把源下载好
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maple</groupId>
<artifactId>ftpdemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>test Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- FTP -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<!-- activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>ftpdemo</finalName>
</build>
</project>
2、新建一个ftpbeen,里面可以设置ftp服务器的参数
package com.maple.ftpdemo.bean;
import java.io.InputStream;
public class FtpBean {
//获取ip地址
private String address;
//端口号
private String port;
//用户名
private String username;
//密码
private String password;
//文件名称
private String fileName;
//基本路径
private String basepath;
//文件输入流
private InputStream inputStream;
public String getAddress() {
return address == null ? "127.0.0.1":address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPort() {
return port == null ? "21":port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username == null ? "maple":username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password == null ?"xxxxxxx":password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFileName() {
return fileName == null ?"未命名":fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getBasepath() {
return basepath == null ?"/local":basepath;
}
public void setBasepath(String basepath) {
this.basepath = basepath;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
}
3、创建FTP服务器的工具类,连接FTP服务器,上传文件
package com.maple.ftpdemo.util;
import java.io.IOException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import com.maple.ftpdemo.bean.FtpBean;
public class FtpUtil {
public static FtpBean ftpSet(){
//设置FTP上传的基本信息,可直接初始化数据
FtpBean ftp = new FtpBean();
//配置服务器信息
ftp.setAddress("169.254.187.243");
ftp.setPort("21");
ftp.setUsername("ftptest");
ftp.setPassword("123456");
return ftp;
}
public static boolean uploadFile(FtpBean ftpBean) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
// System.out.println(ftpBean.getAddress()+"====="+ftpBean.getPort());
ftp.connect(ftpBean.getAddress(), Integer.valueOf(ftpBean.getPort()));// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
// System.out.println(ftpBean.getUsername()+"======"+ftpBean.getPassword());
ftp.login(ftpBean.getUsername(), ftpBean.getPassword());// 登录
reply = ftp.getReplyCode();
System.out.println("状态码"+reply);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
String tempPath = ftpBean.getBasepath();
String fileName = ftpBean.getFileName();
if (!ftp.changeWorkingDirectory(ftpBean.getBasepath())) {
//判断目录是否存在,如果目录不存在创建目录,目录存在则跳转到此目录下
String []tempPathList = tempPath.split("/");
for (String dir : tempPathList) {
if(dir != null && dir != ""){
if (!ftp.changeWorkingDirectory(dir)) {
if (!ftp.makeDirectory(dir)) {
return result;
} else {
ftp.changeWorkingDirectory(dir);
}
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//设置模式很重要
ftp.enterLocalActiveMode();
//上传文件
result = ftp.storeFile(fileName, ftpBean.getInputStream());
if(!result){
return result;
}
ftpBean.getInputStream().close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
注意:上面程序的reply是状态码,大家如果出错可以查看,并且排查错误。
4、新建一个测试类
package com.maple.ftpdemo;
import com.maple.ftpdemo.bean.FtpBean;
import com.maple.ftpdemo.util.FtpUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
public class FtpDemo {
public static void main(String[] args){
long startTime = System.currentTimeMillis(); //获取开始时间
//文件路径
String path="H:\\583.mp4";
String suffix = path.substring(path.lastIndexOf(".") + 1);//获取文件的后缀名
//获取本地需要上传的文件,此处只用作测试
File file = new File(path);
if (file.isFile() && file.exists()) {
//配置FTP服务器
FtpBean ftp=FtpUtil.ftpSet();
//自动生成路径,默认取源文件路径,为FILETYPE时,取文件类型做路径
//如使用自己的路径,直接ftp.setBasepath赋值即可
//文件上传路径
ftp.setBasepath("/upload");
SimpleDateFormat sdfms = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String date = sdfms.format(System.currentTimeMillis());
//添加三位自动生成的数字,防止重复
int j = (int) (Math.random() * 900) + 100;
String fileName = date + j + "." + suffix;
ftp.setFileName(fileName);
try {
//将文件转换成一个输入流
InputStream in = new FileInputStream(file);
ftp.setInputStream(in);
//传入文件名称,和文件输入流,上传至FTP服务器
boolean isOk = FtpUtil.uploadFile(ftp);
if (isOk) {
System.out.println(Thread.currentThread().getName()+"文件上传成功");
} else {
System.out.println(Thread.currentThread().getName()+"文件上传失败");
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("文件不存在");
}
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println(Thread.currentThread().getName()+"程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
}