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
0
投稿
猜你喜欢
- 如下所示://读取json文件地址 /* String path = getClass().getClassLoader().g
- 安装Jenkins提示:首先Jenkins安装方式有2中,一种是yum安装,另一种是使用war的方式进行安装(war就需要安装tomcat)
- 引言最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等。Java 中是如何获取 IP&
- 前言之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-ap
- 一、 代码块的概念在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念。class Test{ public stat
- java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到
- 前言之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,
- 0、前言本文主要对几种常见Java序列化方式进行实现。包括Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Pro
- 我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可
- 1. 继承1. 子类继承了父类,获得父类的全部Field和方法。子类Student类继承父类,将可以获得父类的全部Field和方法publi
- 方式1:1. 明确 Spark中Job 与 Streaming中 Job 的区别1.1 Spark Core一个 RDD DAG Graph
- 前言随着网络技术的发展、计算机应用水平广泛提高,原来系统的时效性、数据的正确性、操作的方便性上都存在不足,已影响到系统的正常使用。经过考察比
- 一. 项目需求我们做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的开源框架,最常见的就是mycat,shar
- 了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以
- feign传输List的坑无法直接传输List错误方法1@RequestMapping(value = "/stat/mercha
- easyExcel简介:Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的
- java数据结构的堆什么是堆堆指的是使用数组保存完全二叉树结构,以层次遍历的方式放入数组中。如图:注意:堆方式适合于完全二叉树,对于非完全二
- 前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本
- 此篇文章内容仅限于 描述springboot与 thy 自定义标签的说明,所以你在看之前,请先会使用springboot和thymeleaf
- 目录Spring自动注入失败如何解决?回答注入你的bean使用@Configurable手动查找bean:不推荐Spring自动注入失败如何