org.apache.commons.net.ftp.FTPClient上传下载文件
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.xml.security.exceptions.Base64DecodingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.xxx.framework.exception.BusinessException;
/**
* FTP 上传工具
*/
@Component
public class FtpFileUtils {
private static final Logger logger = LoggerFactory.getLogger(FtpFileUtils.class);
private static final FTPClient client = new FTPClient();
@Value("${xxx.ftp.server}")
private String ftpServer;
@Value("${xxx.ftp.port}")
private Integer ftpPort;
@Value("${xxx.ftp.username}")
private String username;
@Value("${xxx.ftp.password}")
private String password;
@Value("${xxx.ftp.save.path}")
private String directoryPrefix;// 比如/var/query/up/hopp
/**
* 连接服务器
*
* @throws BusinessException
*/
public void connect() throws BusinessException {
try {
client.connect(ftpServer, ftpPort);
} catch (Exception e) {
throw new BusinessException("connect to ftp server[" + ftpServer + "] fail", e);
}
try {
logger.info("start to login ftp server");
client.login(username, password);
if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
throw new BusinessException("fail login ftp server");
}
logger.info("login ftp server success");
client.changeWorkingDirectory("/");
logger.info("change ftp server working directory");
client.setFileTransferMode(FTP.BINARY_FILE_TYPE);
client.setFileType(FTP.BINARY_FILE_TYPE);
client.setControlEncoding("UTF-8");
} catch (IOException e) {
throw new BusinessException("login to ftp server[" + ftpServer + "] fail", e);
}
}
/**
* 上传文件file
* @param directory
* @param fileName
* @param content
* @throws BusinessException
*/
public void uploadOneFile(String middleDirectory, String fileName, byte[] content) throws BusinessException {
uploadMethodOne(directoryPrefix,middleDirectory, fileName, new ByteArrayInputStream(content));
}
/**
* 上传单个文件
* xxx/hopp/"+entity.getId()+"/
* @param directoryPreffix
* @param directorySuffix
* @param fileName
* @param inputStream
* @throws BusinessException
*/
public void uploadMethodOne(String directoryPreffix,String directorySuffix, String fileName, InputStream inputStream) throws BusinessException {
try {
connect();
logger.info("FTP上传开始");
//根据路径逐层判断目录是否存在,如果不存在则创建(mkd 一次创建多级目录没有得到预期效果)
//1.首先进入ftp的根目录
client.changeWorkingDirectory(directoryPreffix);
String[] dirs = directorySuffix.split("/");
for (String dir : dirs) {
//2.创建并进入不存在的目录
if (!client.changeWorkingDirectory(dir)) {
client.mkd(dir);
client.changeWorkingDirectory(dir);
}
}
logger.info("上传图片:"+directoryPreffix +"/"+directorySuffix + "/" + fileName);
client.storeFile(directoryPreffix +"/"+ directorySuffix + "/" + fileName, inputStream);
logger.info("FTP上传结束");
} catch (Exception e) {
throw new BusinessException("upload fail", e);
} finally {
try {
logger.info("close the ftp server connect");
client.disconnect();
} catch (IOException e) {
throw new BusinessException("close connect fail", e);
}
}
}
/**
* 上传多个文件
* @param directoryPreffix,形如:/var/query/up/hopp
* @param directorySuffix,形如:xxx/hopp/45/
* @param fileMap,形如map:{img_1.jpg ,fileInputStream }
* @throws BusinessException
*/
public void uploadMultiFiles(String directoryPreffix,String directorySuffix, Map<String, Object> fileMap) throws BusinessException {
try {
connect();
logger.info("FTP上传开始");
//根据路径逐层判断目录是否存在,如果不存在则创建(mkd 一次创建多级目录没有得到预期效果)
//1.首先进入ftp的根目录
client.changeWorkingDirectory(directoryPreffix);
String[] dirs = directorySuffix.split("/");
for (String dir : dirs) {
//2.创建并进入不存在的目录
if (!client.changeWorkingDirectory(dir)) {
client.mkd(dir);
client.changeWorkingDirectory(dir);
}
}
if(!fileMap.isEmpty()){
int index=1;
for (Entry<String, Object> entry : fileMap.entrySet()) {
String fileName=directoryPreffix+"/"+directorySuffix+entry.getKey();
InputStream fileInputStream=(InputStream) entry.getValue();
logger.info("上传第"+(index++)+"个图片:"+fileName);
client.storeFile(fileName, fileInputStream);
}
}
logger.info("FTP上传结束");
} catch (Exception e) {
throw new BusinessException("upload fail", e);
} finally {
try {
logger.info("close the ftp server connect");
client.disconnect();
} catch (IOException e) {
throw new BusinessException("close connect fail", e);
}
}
}
/**
* 根据图片路径下载
* @param imgPath,形如:xxx/hopp/262/part_hopp_1.jpg
* @return
* @throws Exception
*/
public synchronized byte[] downloadFileByImgPath(String imgPath) throws BusinessException {
//xxx/hopp/262/part_hopp_1.jpg
Integer idx=imgPath.lastIndexOf("/");
byte[] resultByteArray = null;
try {
String directory = directoryPrefix + "/" + imgPath.substring(0, idx);
String remoteFileName = directoryPrefix + "/" + imgPath;
connect();
client.changeWorkingDirectory(directory);
logger.info(remoteFileName + "下载中...");
ByteArrayOutputStream out = new ByteArrayOutputStream();
boolean success = client.retrieveFile(remoteFileName, out);
resultByteArray = out.toByteArray();
logger.info(remoteFileName + "下载" + (success ? "成功" : "失败"));
} catch (Exception e) {
throw new BusinessException("图片" + imgPath + "下载失败", e);
} finally {
try {
client.disconnect();
} catch (IOException e) {
throw new BusinessException("图片下载异常", e);
}
logger.info("disconnect success");
}
return resultByteArray;
}
/**
* 下载文件
*
* @param remoteFileName
* 待下载文件名称
* @param localDires
* 下载到当地那个路径下
* @param openId
* remoteFileName所在的路径
* @return
* @throws Exception
*/
public synchronized byte[] downloadFileTwo(String type, String openId) throws Exception {
byte[] resultByteArray = null;
try {
String directory = directoryPrefix + "/" + openId;
String remoteFileName = directory + "/" + openId + "_" + type + ".jpg";
connect();
client.changeWorkingDirectory(directory);
logger.info(remoteFileName + "开始下载....");
ByteArrayOutputStream out = new ByteArrayOutputStream();
boolean success = client.retrieveFile(remoteFileName, out);
resultByteArray = out.toByteArray();
logger.info(remoteFileName + "下载" + (success ? "成功" : "失败"));
} catch (Exception e) {
throw new RuntimeException("图片[" + openId + "][" + type + "]下载失败", e);
} finally {
client.disconnect();
logger.info("disconnect success");
}
return resultByteArray;
}
/**
* 压缩二进制图片数据
* 大于10k时压缩,否则不压缩
* @param base64
* @return
* @throws Base64DecodingException
*/
public static byte[] aaa(String base64Str){
byte[] base64BtArray= Base64.decodeBase64(base64Str);
float sizea = base64BtArray.length; //byte[] 计算原图片大小
// 图片小于10kb,不需要压缩
float limitSize = 10 * 1024; // 图片大小上限
if(sizea <= limitSize){
return base64BtArray;
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
Thumbnails.of(new ByteArrayInputStream(base64BtArray)).size(100,100).toOutputStream(os);
} catch (IOException e) {
e.printStackTrace();
}
byte[] scaleResult = os.toByteArray();
return scaleResult;
}
/**
* 压缩二进制图片数据
* 大于10k时压缩,否则不压缩
* @param base64
* @return
* @throws Base64DecodingException
*/
public byte[] bbb(byte[] base64BtArray){
float sizea = base64BtArray.length; //byte[] 计算原图片大小
// 图片小于10kb,不需要压缩
float limitSize = 10 * 1024; // 图片大小上限
if(sizea <= limitSize){
return base64BtArray;
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
Thumbnails.of(new ByteArrayInputStream(base64BtArray)).size(100,100).toOutputStream(os);
} catch (IOException e) {
e.printStackTrace();
}
byte[] scaleResult = os.toByteArray();
return scaleResult;
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...
org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
FTP应用的jar包,主要用于java开发FTP上传下载
.net.ftp.FTPClient jar ,exaple, commons-net-2.0.jar
org.apache.commons.net.ftp的官方完整jar包 放心使用
上传了收集的最新的 commons-io-2.4.jar 包 和 commons-net-3.3.jar 以及 FTP java调用例子。net 包是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)的底层API。Net包...
在3.3版本中,`org.apache.commons.net.ftp.FTPClient`类是实现FTP通信的核心组件。这个类提供了一系列方法,允许开发者与FTP服务器进行交互,执行如上传、下载、删除文件、创建目录等操作。 FTPClient类的主要功能...
标题"org.apache.commons.net.ftp"表明这个压缩包包含了与Apache Commons Net库中FTP相关的类和功能。描述提到“所有jar包里边都有”,这意味着你将获得完整的FTP支持,包括所有必要的依赖。 Apache Commons Net库...
sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP
在本文中,我们将深入探讨如何使用Apache Commons Net库和Java内置的`sun.net.ftp.FtpClient`来实现FTP(文件传输协议)的功能,包括上传、下载、批量操作以及删除文件。这两个库提供了丰富的API,使得在Java应用...
FTPClient是Apache Commons Net库中的一个关键类,用于在Java应用程序中执行FTP(文件传输协议)操作。在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种...
FTPClient封装了所有必要的功能来存储和检索从FTP服务器上的文件。 这个类负责所有与FTP服务器交互的底层细节,并提供了便捷的更高层次的接口。 正如来自所有类SocketClient ,您必须首先连接到与服务器connect做...
例如,FTPClient可以方便地进行FTP文件上传和下载,而SMTPClient则可以帮助实现邮件发送。 5. Apache Commons Lang: 这是Java语言功能的扩展,提供了字符串操作、日期时间处理、枚举工具、数学运算等类。例如,...
首先,我们需要引入Java的FTP客户端库,通常使用`org.apache.commons.net.ftp`包中的`FTPClient`类。Apache Commons Net是Apache软件基金会提供的一组网络协议实用工具,包括对FTP协议的支持。 1. **连接FTP服务器*...
import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply;
Java程序使用Apache的commons-net-3.0.jar包中的org.apache.commons.net.ftp.FTPClient类实现对ftp上传、下载、删除等操作,是一个不错的东西哦
该客户端软件使用的是org.apache.commons.net.ftp.FTPClient这个类,FTPClient这个类,该类具体的可查看官网的api文档,链接:FTPClient API,需要自己导入jar包,我下载的是commons-net-3.6.jar,下载链接为...
`FTPClient`类位于`org.apache.commons.net.ftp`包下,继承自`FTP`类,并实现了`Configurable`接口。这表明`FTPClient`类不仅可以进行FTP操作,还可以被配置。 - **父类**:`FTP` - **实现的接口**:`Configurable`...