FTP服务器上传下载
windows下FTP服务器可以使用3CDaemon,下载后点击FTP服务器设置进行相关设置:
使用jar包坐标如下:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
使用java连接服务器并进行操作,登录FTP后默认在FTP根目录下,如果操作文件需要切换到待操作目录。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.btzh.exception.BusinessException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.util.StringUtils;
/**
* FTP工具类
*
* @author faith
*/
public class FtpUtil {
public final static String HOSTNAME = "127.0.0.1";
public final static Integer PORT = 21;
public final static String USERNAME = "admin";
public final static String PASSWORD = "666666";
public static FTPClient FTP_CLIENT;
public static void main(String[] args) {
FtpUtil.uploadFileByPath("/upload/img/", "test.jpg", "D:\\timg.jpg");
FtpUtil.downloadFile("/upload/img/", "test.jpg", "D:\\ftp");
FtpUtil.deleteFile("upload/img", "test.jpg");
}
/**
* 上传文件by文件名
* @param pathName
* @param fileName
* @param originFileName
*/
public static void uploadFileByPath(String pathName, String fileName, String originFileName) {
InputStream inputStream = null;
FTP_CLIENT = getFtpClient();
try {
FTP_CLIENT.setFileType(FTP.BINARY_FILE_TYPE);
createIfNotExsit(pathName);
FTP_CLIENT.storeFile(fileName, inputStream = new FileInputStream(new File(originFileName)));
} catch (Exception e) {
throw new RuntimeException("上传文件失败: " + e);
} finally {
closeIOResource(FTP_CLIENT, inputStream, null);
}
}
/**
* 上传文件by流
* @param pathname
* @param fileName
* @param inputStream
*/
public static void uploadFileByStream(String pathname, String fileName, InputStream inputStream) {
FTP_CLIENT = getFtpClient();
try {
FTP_CLIENT.setFileType(FTP.BINARY_FILE_TYPE);
createIfNotExsit(pathname);
FTP_CLIENT.storeFile(fileName, inputStream);
} catch (Exception e) {
throw new RuntimeException("上传文件失败");
} finally {
closeIOResource(FTP_CLIENT, inputStream, null);
}
}
/**
* 下载文件
* @param pathname
* @param filename
* @param localPath
* @return
*/
public static void downloadFile(String pathname, String filename, String localPath) {
OutputStream outputStream = null;
FTP_CLIENT = getFtpClient();
try {
FTP_CLIENT.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = FTP_CLIENT.listFiles();
for (FTPFile ftpFile : ftpFiles) {
if (ftpFile.getName().equalsIgnoreCase(filename)) {
FTP_CLIENT.retrieveFile(ftpFile.getName(), outputStream = new FileOutputStream(new File(localPath + "/" + ftpFile.getName())));
return;
}
}
throw new BusinessException("未找到文件:" + pathname + "/" + filename);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
closeIOResource(FTP_CLIENT, null, outputStream);
}
}
/**
* 删除文件
* @param pathName
* @param fileName
*/
public static void deleteFile(String pathName, String fileName) {
FTP_CLIENT = getFtpClient();
try {
FTP_CLIENT.changeWorkingDirectory(pathName);
FTP_CLIENT.dele(fileName);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
closeIOResource(FTP_CLIENT, null, null);
}
}
/**
* 改变工作目录
* @param directory
* @return
*/
public static boolean changeWorkingDirectory(String directory) {
try {
return FTP_CLIENT.changeWorkingDirectory(directory);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 创建目录
* @param directory
*/
public static void createIfNotExsit(String directory) {
if (directory.equalsIgnoreCase("/")) {
return;
}
while (directory.startsWith("/") || directory.endsWith("/")) {
directory = directory.substring(directory.startsWith("/") ? 1 : 0, directory.endsWith("/") ? directory.length() - 1 : directory.length());
if (directory.equalsIgnoreCase("/")) {
return;
}
}
String[] filePaths = StringUtils.delimitedListToStringArray(directory, "/");
for (String filePath : filePaths) {
if (!existFilePath(filePath)) {
makeDirectory(filePath);
}
changeWorkingDirectory(filePath);
}
}
/**
* 判断文件是否存在
* @param filePath
* @return
*/
public static boolean existFilePath(String filePath) {
try {
return FTP_CLIENT.listFiles(filePath).length > 0;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 创建文件目录
* @param directory
* @return
*/
public static boolean makeDirectory(String directory) {
try {
return FTP_CLIENT.makeDirectory(directory);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 连接FTP服务器
*/
public static FTPClient getFtpClient() {
FTP_CLIENT = new FTPClient();
FTP_CLIENT.setControlEncoding("UTF-8");
try {
FTP_CLIENT.connect(HOSTNAME, PORT);
if (!FTP_CLIENT.login(USERNAME, PASSWORD)) {
throw new RuntimeException("ftp登录失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return FTP_CLIENT;
}
/**
* 关闭使用的资源
* @param ftpClient
* @param inputStream
*/
private static void closeIOResource(FTPClient ftpClient, InputStream inputStream, OutputStream outputStream) {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
}
}
if (null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
}
}
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
java零基础系统学习路线
在大家看之前,我要先声明两点。 1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。 2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。 如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。 第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。 一、Java基础首先去找一个Java的基础教程学一下,学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。 二、Web开发等你写上几天程序以后,你往往会比较迷茫,因为...
-
下一篇
探索Java日志的奥秘:底层日志系统-logback
前言 在之前的文章解析了slf4j,上层的框架已经了解清楚了,那就接着看底层日志吧。本文中不对JCL和JUL进行源码解读,只是对logback进行主要代码解读。logback是java的日志开源组件,是log4j创始人写的,性能比log4j要好,目前主要分为3个模块 logback-core: 核心代码模块 logback-classic: log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事 logback-access: 访问模块与Servlet容器集成提供通过Http来访问日志的功能 本文主要分析core模块 源码探索 我们还是从桥接的部分开始看起。找到LogbackServiceProvider,跟进getLoggerFactory public ILoggerFactory getLo
相关文章
文章评论
共有0条评论来说两句吧...