手把手教你Java连接FTP服务器(二):java端程序

环境介绍:我使用的是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");    //输出程序运行时间
	}
}

在这里插入图片描述

完成欧耶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值