Java接口实现对远端FTP服务器上传和下载
依赖Apache FTPClient
1. FtpUtil工具类
包含1.获取FTPClient对象的方法 2.对ftp服务器上传和下载文件的方法
import java.io.*;
import java.net.SocketException;
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;
public class FtpUtil {
private final static Log logger = LogFactory.getLog(FtpUtil.class);
/**
* 获取FTPClient对象
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient = new FTPClient();
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
// 登陆FTP服务器
ftpClient.login(ftpUserName, ftpPassword);
// 中文支持
ftpClient.setControlEncoding("UTF-8");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
} 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 FTP服务器上要下载的文件名称
* @param targetFileName 下载到本地的文件名称
*/
public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName) {
FTPClient ftpClient = null;
try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.changeWorkingDirectory(ftpPath);
System.out.println("连接成功,改变目录中...");
ftpClient.makeDirectory("summer");
//编码文件格式,解决中文文件名
String f_ame = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
File localFile = new File(localPath + File.separatorChar + targetFileName);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(f_ame, os);
os.close();
ftpClient.logout();
} 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();
}
}
/**
* 根据名称获取文件,以字节数组返回
*
* @param ftpPath FTP服务器文件相对路径,例如:test/123
* @param fileName 文件名,例如:test.xls
* @return byte[] 字节数组对象
*/
public static byte[] getFileBytesByName(String ftpPath, String fileName) {
// 登录
FTPClient ftpClient = null;
//创建byte数组输出流
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try {
//获取FTPClient
ftpClient = getFTPClient();
ftpClient.changeWorkingDirectory(ftpPath);
//创建文件夹
ftpClient.makeDirectory("summer");
// 设置被动模式,开通一个端口来传输数据
ftpClient.enterLocalPassiveMode();
String[] fs = ftpClient.listNames();
// 判断该目录下是否有文件
if (fs == null || fs.length == 0) {
logger.error(ftpPath + "该目录下没有文件");
return byteStream.toByteArray();
}
for (String ff : fs) {
String ftpName = new String(ff.getBytes("ISO-8859-1"), "GBK");
if (ftpName.equals(fileName)) {
try (InputStream is = ftpClient.retrieveFileStream(ff);) {
byte[] buffer = new byte[1024 * 1024 * 4];
int len = -1;
while ((len = is.read(buffer, 0, 1024 * 1024 * 4)) != -1) {
byteStream.write(buffer, 0, len);
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
break;
}
}
}catch (Exception e){
e.printStackTrace();
}
return byteStream.toByteArray();
}
/**
* Description: 向FTP服务器上传文件
* @param ftpHost FTP服务器hostname
* @param ftpPort FTP服务器端口
* @param ftpUserName FTP登录账号
* @param ftpPassword FTP登录密码
* @param ftpPath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String filename, InputStream input) {
boolean result = false;
FTPClient ftpClient = new FTPClient();
try {
int reply;
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.changeWorkingDirectory(ftpPath);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return result;
}
//编码文件名,支持中文文件名
filename = new String(filename.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
//上传文件
if (!ftpClient.storeFile(filename, input)) {
return result;
}
input.close();
ftpClient.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
2. 接口调用
这里仅展示下载
import io.choerodon.core.iam.ResourceLevel;
import io.choerodon.swagger.annotation.Permission;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.hbcm.sap.config.SwaggerTags;
import org.hbcm.sap.infra.util.FtpUtil;
import org.hzero.core.base.BaseController;
import org.hzero.core.util.Results;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: hbcm-sap
* @description: ftp
* @author: Summer
* @create: 2019-10-24 17:43
**/
@Api(tags = SwaggerTags.TEST)
@RestController("ftpController.v1")
@RequestMapping("/v1/{organizationId}/ftp")
public class FtpController extends BaseController {
@ApiOperation(value = "获取文件")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
/**
*返回值类型自行设置,ResponseEntity是我司封装返回类型,可改为void及其他
*/
public ResponseEntity<String> uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName){
FtpUtil.downloadFtpFile(ftpHost,ftpUserName,ftpPassword,ftpPort,ftpPath,localPath,fileName,targetFileName);
return Results.success();
}
}
3. swagger测试
各参数在方法描述里已做说明,此处不做赘述
执行结果:
4. 至此,FTP工具类测试完毕,可通过接口调用.
有问题可在评论区与博主互动,共同学习共同进步.
干,就完事了嗷!
引用: https://blog.csdn.net/xqq580231/article/details/80046411