/**
* Description: 向FTP服务器上传文件
* @param ftpPath FTP服务器文件存放路径
* @param multipartFile 上传到FTP服务器上的文件
* @return 成功返回文件名,比如 uuid.jpg,失败返回null
*/
public String uploadFileToFtpService(String ftpPath, MultipartFile multipartFile) {
//截取文件格式后缀
String fileSuffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
//uuid.格式 是文件名
String fileName = UUID.randomUUID() + "."+fileSuffix;
FTPClient ftpClient=null;
try {
//连接ftp
ftpClient = getFTPConnection();
if(ftpClient==null){
logger.error("ftp服务器连接失败");
return null;
}
/*该部分为逐级创建,并切换到工作目录*/
String[] split = ftpPath.split("/");
for (String str : split) {
if(StringUtils.isBlank(str)) {
continue;
}
if (!ftpClient.changeWorkingDirectory(str)) {//注意这步必须加上进入目录,否则当目录不存在时候只创建目录不进入则文件写入有问题
//防止中文编码导致目录找不到
String directory = new String(str.getBytes("UTF-8"),"iso-8859-1");
//目录不存在则创建目录
ftpClient.makeDirectory(directory);
//更换目录到当前目录,否则目录不存在时只是创建目录而不能写入文件到该目录
ftpClient.changeWorkingDirectory(directory);
}
}
ftpClient.enterLocalPassiveMode();//工作模式被动
InputStream input = multipartFile.getInputStream();
//文件写入 远程文件名;输入流
boolean storeFile = ftpClient.storeFile(fileName, input);
if (!storeFile) {
return null;
}
input.close();
ftpClient.logout();
} catch (IOException e) {
logger.error(e.getMessage());
return null;
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return fileName;
}
/**
* 连接FTP服务器
* @return
*/
private FTPClient getFTPConnection(){
try {
//创建ftp客户端
FTPClient ftpClient = new FTPClient();
//FTP服务器端口,默认21,使用默认端口可以不写
ftpClient.connect(ftpHost,Integer.parseInt(ftpPort));// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftpClient.login(ftpUsername, ftpPassword);// 登录
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("登录成功");
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();//设置被动模式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置传输模式,一定要设置二进制传输格式
return ftpClient;
}else{
//登录失败返回Null
ftpClient.disconnect();
return null;
}
} catch (IOException e) {
return null;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界