Java实现FTP上传与下载功能
作者:hehuijava 发布时间:2021-09-22 18:28:51
标签:Java,上传,下载
本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下
JAVA操作FTP服务器,只需要创建一个FTPClient即可,所有的操作都封装在FTPClient中,JDK自带的有FTPClient(sun.net.ftp.FtpClient),也可以用第三方的FTPClient,一般使用apache的FTPClient(org.apache.commons.net.ftp.FTPClient),本文将使用apache的FTPClient,API都大同小异
关键依赖:commons-net
对常用操作(上传、下载)封装成工具类
package com.day0322;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* FTP工具类
* 文件上传
* 文件下载
*/
public class FTPUtil {
private static final Logger log = LoggerFactory.getLogger(FTPUtil.class);
/**
* 设置缓冲区大小4M
**/
private static final int BUFFER_SIZE = 1024 * 1024 * 4;
/**
* 本地字符编码
**/
private static String LOCAL_CHARSET = "GBK";
/**
* UTF-8字符编码
**/
private static final String CHARSET_UTF8 = "UTF-8";
/**
* OPTS UTF8字符串常量
**/
private static final String OPTS_UTF8 = "OPTS UTF8";
/**
* FTP协议里面,规定文件名编码为iso-8859-1
**/
private static final String SERVER_CHARSET = "ISO-8859-1";
private static FTPClient ftpClient = null;
/**
* 连接FTP服务器
*/
private static void login(OaFtp oaFtp) {
ftpClient = new FTPClient();
try {
ftpClient.connect(oaFtp.getIp(), Integer.valueOf(oaFtp.getPort()));
ftpClient.login(oaFtp.getName(), oaFtp.getPwd());
ftpClient.setBufferSize(BUFFER_SIZE);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
closeConnect();
}
} catch (Exception e) {
log.error("",e);
throw new RuntimeException(e);
}
}
/**
* 关闭FTP连接
*/
private static void closeConnect() {
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
log.error("",e);
}
}
}
/**
* FTP服务器路径编码转换
*
* @param ftpPath FTP服务器路径
* @return String
*/
private static String changeEncoding(String ftpPath) {
String directory = null;
try {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
LOCAL_CHARSET = CHARSET_UTF8;
}
directory = new String(ftpPath.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
} catch (Exception e) {
log.error("",e);
}
return directory;
}
/**
* 改变工作目录
* 如果没有,则创建工作目录
* @param path
*/
private static void changeAndMakeWorkingDir(String path) {
try {
ftpClient.changeWorkingDirectory("/");
path = path.replaceAll("\\\\","/");
String[] path_array = path.split("/");
for (String s : path_array) {
boolean b = ftpClient.changeWorkingDirectory(s);
if (!b) {
ftpClient.makeDirectory(s);
ftpClient.changeWorkingDirectory(s);
}
}
} catch (IOException e) {
log.error("",e);
throw new RuntimeException(e);
}
}
/**
* 上传
* @param oaFtp
* @param filename
* @param dirPath
* @param in
* @return
*/
public static boolean upload (OaFtp oaFtp, String filename, String dirPath, InputStream in) {
login(oaFtp);
if (!ftpClient.isConnected()) {
return false;
}
boolean isSuccess = false;
if (ftpClient != null) {
try {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
LOCAL_CHARSET = CHARSET_UTF8;
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
String path = changeEncoding(dirPath);
changeAndMakeWorkingDir(path);
isSuccess = ftpClient.storeFile(new String(filename.getBytes(), SERVER_CHARSET), in);
} catch (Exception e) {
log.error("",e);
} finally {
closeConnect();
}
}
return isSuccess;
}
/**
* 下载
* @param oaFtp
* @param filename
* @param dirPath
* @param out
* @return
*/
public static void download (OaFtp oaFtp, String filename, String dirPath, FileOutputStream out) {
// 登录
login(oaFtp);
if (ftpClient != null) {
try {
String path = changeEncoding(dirPath);
changeAndMakeWorkingDir(path);
String[] fileNames = ftpClient.listNames();
if (fileNames == null || fileNames.length == 0) {
return;
}
for (String fileName : fileNames) {
String ftpName = new String(fileName.getBytes(SERVER_CHARSET), LOCAL_CHARSET);
if (StringUtils.equals(ftpName,filename)) {
InputStream in = ftpClient.retrieveFileStream(fileName);
IOUtils.copy(in,out);
}
}
} catch (IOException e) {
log.error("",e);
} finally {
closeConnect();
}
}
}
}
测试
1.上传
2.下载
来源:https://blog.csdn.net/hehuihh/article/details/115124225


猜你喜欢
- 写在前面SpringBoot创建定时任务的方式很简单,主要有两种方式:一、基于注解的方式(@Scheduled)二、数据库动态配置。实际开发
- 前言:这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,用户体验不会很好,一般应用
- java 遍历listpackage com.tiandy.core.rest;import java.util.ArrayList;imp
- 一、函数式接口概念函数式接口在Java中是指:有且仅有一个抽象方法的接口。 当然接口中可以包含其他的方法(默认,静态,私有)函数式接口,即适
- 需求某航空公司物流单信息查询,是一个post请求。通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使
- C# 的析构以及垃圾回收实例分析看书时,自己写的例子代码,了解到几个知识点,记载下来。同时发现自己手写代码的能力比较弱,还是得多写一下。us
- 切面编程听起来可能有点陌生,不过现在越来越多的开发团队正在用上这种技术。先说熟悉的面向对象编程 OOP,通常都是用各种对象/模块来负责具体的
- 本文实例讲述了Android简单实现启动画面的方法。分享给大家供大家参考,具体如下:核心代码:package com.demo.app;im
- 前言之前写过 Mybatis Plus 的基本配置和使用。Mybatis-Plus 看这一篇就够了当初在进行查询时,虽然没有写硬SQL进行查
- 运算符运算符,顾名思义就是用来执行数学运算的。在Java中运算符可以分为:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算
- Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们
- 本文实例分析了C#动态生成DropDownList执行失败原因。分享给大家供大家参考。具体如下:今天研究DDL控件的动态生成的时候遇到了点问
- JAVA常用关键字及其用法简要说明Abstract: 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可
- springboot项目还是ssm等java常用框架都会有这样的问题,解决办法通用问题场景前端发送Post请求,前端返回400 Bad Re
- 1.单文件上传首先创建一个Spring Boot项目,并添加spring-boot-starter-web依赖然后创建一个upload.js
- 对象的初始化和清理生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全。C++中的面向对象来源于生
- 目录1. 应用场景1.1. 保障线程安全1.2. 显示传递参数2. 实现原理3. 注意事项ThreadLocal是线程私有的局部变量存储容器
- 一、项目简述本系统功能包括:通知公告,老人管理,护工管理,问答管理等等功能。二、项目运行环境配置: Jdk1.8 + Tomcat8.5 +
- 本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下:重力感应主要是依靠手机的加速度传感器(acceleromet
- 序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程。对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过