From 8b464ee379c5b35ac8b22b4e5dde25c4f6fb75cf Mon Sep 17 00:00:00 2001
From: zengh <123456>
Date: Thu, 19 Aug 2021 15:03:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
src/main/java/org/springblade/modules/information/controller/FtpUtil.java | 343 ++++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 276 insertions(+), 67 deletions(-)
diff --git a/src/main/java/org/springblade/modules/information/controller/FtpUtil.java b/src/main/java/org/springblade/modules/information/controller/FtpUtil.java
index fdfe976..f4e85b8 100644
--- a/src/main/java/org/springblade/modules/information/controller/FtpUtil.java
+++ b/src/main/java/org/springblade/modules/information/controller/FtpUtil.java
@@ -1,95 +1,304 @@
package org.springblade.modules.information.controller;
-import sun.net.ftp.FtpClient;
-import sun.net.ftp.FtpProtocolException;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.SocketException;
-import java.io.*;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPReply;
+
+/**
+ * ftp工具类
+ * @author lijj
+ */
public class FtpUtil {
- FtpClient ftpClient;
+ private final static Log logger = LogFactory.getLog(FtpUtil.class);
+ /** 本地字符编码 */
+ private static String LOCAL_CHARSET = "GBK";
+
+ // FTP协议里面,规定文件名编码为iso-8859-1
+ private static String SERVER_CHARSET = "ISO-8859-1";
/**
- * 连接FTP服务
+ * 获取FTPClient对象
*
- * @param url //IP地址
- * @param port//端口号
- * @param username//用户名
- * @param password//密码
+ * @param ftpHost
+ * FTP主机服务器
+ *
+ * @param ftpPassword
+ * FTP 登录密码
+ *
+ * @param ftpUserName
+ * FTP登录用户名
+ *
+ * @param ftpPort
+ * FTP端口 默认为21
+ *
* @return
*/
- public static FtpClient connectFTP(String url, int port, String username, String password) {
- //创建ftp
- FtpClient ftp = null;
+ public static FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {
+ FTPClient ftpClient = null;
try {
- //创建地址
- SocketAddress addr = new InetSocketAddress(url, port);
- //连接
- ftp = FtpClient.create();
- ftp.connect(addr);
- //登陆
- ftp.login(username, password.toCharArray());
- ftp.setBinaryType();
- } catch (FtpProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return ftp;
- }
-
- /**
- * 取ftp上的文件内容
- *
- * @param ftpFile
- * @param ftp
- * @return
- */
- public static List<String> download(String ftpFile, FtpClient ftp) {
- List<String> list = new ArrayList<String>();
- String str = "";
- InputStream is = null;
- BufferedReader br = null;
- try {
- // 获取ftp上的文件
- is = ftp.getFileStream(ftpFile);
- //转为字节流
- br = new BufferedReader(new InputStreamReader(is));
- while ((str = br.readLine()) != null) {
- list.add(str);
+ ftpClient = new FTPClient();
+ ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
+ ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
+ if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
+ logger.info("未连接到FTP,用户名或密码错误。");
+ ftpClient.disconnect();
+ } else {
+ logger.info("FTP连接成功。");
}
- br.close();
- } catch (FtpProtocolException e) {
+ } catch (SocketException e) {
e.printStackTrace();
+ logger.info("FTP的IP地址可能错误,请正确配置。");
+ } catch (IOException e) {
+ e.printStackTrace();
+ logger.info("FTP的端口错误,请正确配置。");
+ }
+ return ftpClient;
+ }
+
+ /**
+ * 从FTP服务器下载文件
+ *
+ * @param ftpHost FTP IP地址
+ *
+ * @param ftpUserName FTP 用户名
+ *
+ * @param ftpPassword FTP用户名密码
+ *
+ * @param ftpPort FTP端口
+ *
+ * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
+ *
+ * @param localPath 下载到本地的位置 格式:H:/download
+ *
+ * @param fileName 文件名称
+ */
+ public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort,
+ String ftpPath, String localPath, String fileName) {
+
+ FTPClient ftpClient = null;
+
+ try {
+ ftpClient = getFTPClient(ftpHost, ftpPort, ftpUserName, ftpPassword);
+ // 设置上传文件的类型为二进制类型
+ if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
+ LOCAL_CHARSET = "UTF-8";
+ }
+ ftpClient.setControlEncoding(LOCAL_CHARSET);
+ ftpClient.enterLocalPassiveMode();// 设置被动模式
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输的模式
+ // 上传文件
+ //对中文文件名进行转码,否则中文名称的文件下载失败
+ String fileNameTemp = new String(fileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
+ ftpClient.changeWorkingDirectory(ftpPath);
+
+ InputStream retrieveFileStream = ftpClient.retrieveFileStream(fileNameTemp);
+
+ // 第一种方式下载文件(推荐)
+ /* File localFile = new File(localPath + File.separatorChar + fileName);
+ OutputStream os = new FileOutputStream(localFile);
+ ftpClient.retrieveFile(fileName, os); os.close();*/
+
+
+ // 第二种方式下载:将输入流转成字节,再生成文件,这种方式方便将字节数组直接返回给前台jsp页面
+ byte[] input2byte = input2byte(retrieveFileStream);
+ byte2File(input2byte, localPath, fileName);
+
+ if(null != retrieveFileStream){
+ retrieveFileStream.close();
+ }
} catch (FileNotFoundException e) {
+ logger.error("没有找到" + ftpPath + "文件");
+ e.printStackTrace();
+ } catch (SocketException e) {
+ logger.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
+ logger.error("文件读取错误。");
+ e.printStackTrace();
+ } finally {
+
+ if (ftpClient.isConnected()) {
+ try {
+ //退出登录
+ ftpClient.logout();
+ //关闭连接
+ ftpClient.disconnect();
+ } catch (IOException e) {
+ }
+ }
}
- return list;
}
- public static void main(String[] args) {
- FtpClient ftp = connectFTP("192.168.0.109",21,"anonymous","");
- List<String> list = download("D:\\anbao", ftp);
- for (int i = 0; i < list.size(); i++) {
- String strOut = null;
- if (list.get(i).toString() != null) {
- try {
- byte[] bs = list.get(i).toString().getBytes();
- strOut = new String(bs, "utf-8");
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
+ public static boolean uploadFile(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword,
+ String basePath, String filePath, String filename, InputStream input) {
+ boolean result = false;
+ FTPClient ftpClient = null;
+ try {
+ int reply;
+ ftpClient = getFTPClient(ftpHost, ftpPort, ftpUserName, ftpPassword);
+ reply = ftpClient.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(reply)) {
+ ftpClient.disconnect();
+ return result;
+ }
+ // 切换到上传目录
+ if (!ftpClient.changeWorkingDirectory(basePath + filePath)) {
+ // 如果目录不存在创建目录
+ String[] dirs = filePath.split("/");
+ String tempPath = basePath;
+ for (String dir : dirs) {
+ if (null == dir || "".equals(dir))
+ continue;
+ tempPath += "/" + dir;
+ if (!ftpClient.changeWorkingDirectory(tempPath)) {
+ if (!ftpClient.makeDirectory(tempPath)) {
+ return result;
+ } else {
+ ftpClient.changeWorkingDirectory(tempPath);
+ }
+ }
+ }
+ }
+ // 设置上传文件的类型为二进制类型
+ if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
+ LOCAL_CHARSET = "UTF-8";
+ }
+ ftpClient.setControlEncoding(LOCAL_CHARSET);
+ ftpClient.enterLocalPassiveMode();// 设置被动模式
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输的模式
+ // 上传文件
+ filename = new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
+ if (!ftpClient.storeFile(filename, input)) {
+ return result;
+ }
+
+ if(null != input){
+ input.close();
+ }
+
+ result = true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (ftpClient.isConnected()) {
+ try {
+ //退出登录
+ ftpClient.logout();
+ //关闭连接
+ ftpClient.disconnect();
+ } catch (IOException ioe) {
+ }
+ }
+ }
+ return result;
+ }
+
+
+ public static boolean deleteFile(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String pathname,
+ String filename) {
+ boolean flag = false;
+ FTPClient ftpClient = new FTPClient();
+ try {
+ ftpClient = getFTPClient(ftpHost, ftpPort, ftpUserName, ftpPassword);
+ // 验证FTP服务器是否登录成功
+ int replyCode = ftpClient.getReplyCode();
+ if (!FTPReply.isPositiveCompletion(replyCode)) {
+ return flag;
+ }
+ // 切换FTP目录
+ ftpClient.changeWorkingDirectory(pathname);
+ // 设置上传文件的类型为二进制类型
+ if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
+ LOCAL_CHARSET = "UTF-8";
+ }
+ ftpClient.setControlEncoding(LOCAL_CHARSET);
+ ftpClient.enterLocalPassiveMode();// 设置被动模式
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输的模式
+ //对中文名称进行转码
+ filename = new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
+ ftpClient.dele(filename);
+ flag = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (ftpClient.isConnected()) {
+ try {
+ //退出登录
+ ftpClient.logout();
+ //关闭连接
+ ftpClient.disconnect();
+ } catch (IOException e) {
+ }
+ }
+ }
+ return flag;
+ }
+
+ // 将字节数组转换为输入流
+ public static final InputStream byte2Input(byte[] buf) {
+ return new ByteArrayInputStream(buf);
+ }
+
+ // 将输入流转为byte[]
+ public static final byte[] input2byte(InputStream inStream) throws IOException {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = inStream.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ byte[] in2b = swapStream.toByteArray();
+ return in2b;
+ }
+
+ // 将byte[]转为文件
+ public static void byte2File(byte[] buf, String filePath, String fileName) {
+ BufferedOutputStream bos = null;
+ FileOutputStream fos = null;
+ File file = null;
+ try {
+ File dir = new File(filePath);
+ if (!dir.exists() && dir.isDirectory()) {
+ dir.mkdirs();
+ }
+ file = new File(filePath + File.separator + fileName);
+ fos = new FileOutputStream(file);
+ bos = new BufferedOutputStream(fos);
+ bos.write(buf);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (bos != null) {
+ try {
+ bos.close();
+ } catch (IOException e) {
e.printStackTrace();
}
}
- System.out.println(strOut);
- System.out.println(list.get(i).toString());
+ if (fos != null) {
+ try {
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
}
}
}
--
Gitblit v1.9.3