/**
* 导出案例
*
* @param response
*/
public void exportUserListWithCsv(HttpServletResponse response) {
List exportItem = new ArrayList<>();
// 查询数据
List dbData = userService.list();
// 使用字符串数组方式作为表头导出csv数据
List
三、ftp工具
Ftp文件上传下载相比excel、csv等出现的场景较少,「但是,如果你参与的项目是政府或者涉及到第三方旧系统对接的时候,很多时候就需要使用到它。因为很多旧系统或者政府项目使用的技术比较旧或者有制度限制,一般都是以文件的形式与你进行交互,此时ftp工具就很有效了。」
Ftp工具使用的commons-net开源框架进行实现,具体的集成流程之前单独使用一篇文章进行了非常详细的介绍,有需要的读者可以点击后面链接查看:手把手教你搭建ftp服务器,并用程序完成ftp上传下载功能
「部分源码如下:」
/**
* 上传
*
* @return
*/
public boolean upload(FtpUploadParam param) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
//1 测试连接
if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {
try {
//2 检查工作目录是否存在,不存在则创建
if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {
ftpClient.makeDirectory(param.getWorkingPath());
}
// 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)
String fileName = new String(param.getSaveName().getBytes(ftpClientCharset), ftpServerCharset);
// 3 上传文件
if (ftpClient.storeFile(fileName, param.getInputStream())) {
flag = true;
} else {
log.warn("FtpUtils uploadFile unsuccessfully!!");
}
} catch (IOException e) {
log.error("FtpUtils upload in error:{}", e);
} finally {
disconnect(ftpClient);
}
}
return flag;
}
/**
* @description: 下载ftp文件
* @param:
* @param: param
* @param: downloadFileName
* @return:
* @date: 2022/7/14 10:56
*/
public boolean download(FtpDownloadParam param, String downloadFileName) {
FTPClient ftpClient = new FTPClient();
FileOutputStream out = null;
boolean downloadResult = false;
//1 测试连接
if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {
try {
String localPath = param.getDownloadPath() + param.getFileName();
out = new FileOutputStream(new File(localPath));
//2 检查工作目录是否存在,不存在返回
// if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {
// return false;
// }
/*
* 打开FTP服务器的PASS模式(不记得FTP协议支持的模式请翻到文章第一阶段)
* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据. 因为ftp
* server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,可能出现出现阻塞
*/
ftpClient.enterLocalPassiveMode();
// 设置文件的传输方式-二进制
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)
// 缺少编码转换会导致:从FTP服务器下载下来的文件是破损的,无法被打开
downloadResult = ftpClient.retrieveFile(new String(downloadFileName
.getBytes(ftpClientCharset), ftpServerCharset), out);
out.flush();
} catch (IOException e) {
log.error("FtpUtils upload in error:{}", e);
return false;
} finally {
try {
if (Objects.nonNull(out)) {
out.close();
}
} catch (Exception e) {
log.error("FtpUtils upload in error:{}", e);
}
disconnect(ftpClient);
}
}
return downloadResult;
}