package com.panzhihua.common.service.ftp;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPFile;
|
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Service;
|
import sun.misc.BASE64Encoder;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
|
/**
|
* @program: springcloud_k8s_panzhihuazhihuishequ
|
* @description: ftp
|
* @author: huang.hongfa weixin hhf9596 qq 959656820
|
* @create: 2020-11-30 13:29
|
**/
|
@Slf4j
|
@Component
|
public class FTPClientService {
|
private FTPClient ftpClient=new FTPClient();
|
|
public String readFileToBase64(String remoteFileName, String remoteDir) {
|
if (ftpClient == null) {
|
return null;
|
}
|
|
String base64 = "";
|
InputStream inputStream = null;
|
|
try {
|
ftpClient.changeWorkingDirectory(remoteDir);
|
FTPFile[] ftpFiles = ftpClient.listFiles(remoteDir);
|
Boolean flag = false;
|
//遍历当前目录下的文件,判断要读取的文件是否在当前目录下
|
for (FTPFile ftpFile : ftpFiles) {
|
if (ftpFile.getName().equals(remoteFileName)) {
|
flag = true;
|
}
|
}
|
|
if (!flag) {
|
log.error("directory:{}下没有 {}", remoteDir, remoteFileName);
|
return null;
|
}
|
//获取待读文件输入流
|
inputStream = ftpClient.retrieveFileStream(remoteDir + remoteFileName);
|
|
//inputStream.available() 获取返回在不阻塞的情况下能读取的字节数,正常情况是文件的大小
|
byte[] bytes = new byte[inputStream.available()];
|
|
inputStream.read(bytes);//将文件数据读到字节数组中
|
BASE64Encoder base64Encoder = new BASE64Encoder();
|
base64 = base64Encoder.encode(bytes);//将字节数组转成base64字符串
|
log.info("read file {} success", remoteFileName);
|
ftpClient.logout();
|
} catch (IOException e) {
|
log.error("read file fail ----->>>{}", e.getCause());
|
return null;
|
} finally {
|
if (ftpClient.isConnected()) {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {
|
log.error("disconnect fail ------->>>{}", e.getCause());
|
}
|
}
|
|
if (inputStream != null) {
|
try {
|
inputStream.close();
|
} catch (IOException e) {
|
log.error("inputStream close fail -------- {}", e.getCause());
|
}
|
}
|
|
}
|
|
return base64;
|
}
|
|
/**
|
* 下载文件到指定目录
|
*
|
* @param remoteFileName 远程文件名字
|
* @param remoteDir 远程文件目录
|
* @param httpServletResponse 输出流
|
*/
|
public Boolean download(String remoteFileName, String remoteDir, HttpServletResponse httpServletResponse) {
|
if (ftpClient == null) {
|
log.error("ftpclient 不存在");
|
return false;
|
}
|
InputStream inputStream = null;
|
try {
|
ftpClient.changeWorkingDirectory(remoteDir);
|
FTPFile[] ftpFiles = ftpClient.listFiles(remoteDir);
|
Boolean flag = false;
|
//遍历当前目录下的文件,判断要读取的文件是否在当前目录下
|
for (FTPFile ftpFile : ftpFiles) {
|
if (ftpFile.getName().equals(remoteFileName)) {
|
flag = true;
|
}
|
}
|
if (!flag) {
|
log.error("directory:{}下没有 {}", remoteDir, remoteFileName);
|
return false;
|
}
|
//获取待读文件输入流
|
inputStream = ftpClient.retrieveFileStream(remoteDir + remoteFileName);
|
//inputStream.available() 获取返回在不阻塞的情况下能读取的字节数,正常情况是文件的大小
|
byte[] bytes = new byte[inputStream.available()];
|
inputStream.read(bytes);//将文件数据读到字节数组中
|
|
httpServletResponse.setContentType("application/vnd.ms-excel");
|
httpServletResponse.setHeader("Content-disposition", "attachment;filename=社区党员数据导入模板.xls");
|
OutputStream ouputStream = httpServletResponse.getOutputStream();
|
ouputStream.write(bytes);
|
ouputStream.flush();
|
ouputStream.close();
|
ftpClient.logout();
|
} catch (IOException e) {
|
log.error("read file fail ----->>>{}", e.getCause());
|
return false;
|
} finally {
|
if (ftpClient.isConnected()) {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {
|
log.error("disconnect fail ------->>>{}", e.getCause());
|
}
|
}
|
|
if (inputStream != null) {
|
try {
|
inputStream.close();
|
} catch (IOException e) {
|
log.error("inputStream close fail -------- {}", e.getCause());
|
}
|
}
|
|
}
|
return true;
|
}
|
|
/**
|
* 上传文件
|
*
|
* @param inputStream 待上传文件的输入流
|
* @param originName 文件保存时的名字
|
* @param remoteDir 文件要存放的目录
|
*/
|
public boolean uploadFile(InputStream inputStream, String originName, String remoteDir) {
|
if (ftpClient == null) {
|
return false;
|
}
|
try {
|
ftpClient.changeWorkingDirectory(remoteDir);//进入到文件保存的目录
|
Boolean isSuccess = ftpClient.storeFile(originName, inputStream);//保存文件
|
// if (!isSuccess){
|
// throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"---》上传失败!");
|
// }
|
log.info("{}---》上传成功!", originName);
|
ftpClient.logout();
|
return true;
|
} catch (IOException e) {
|
log.error("{}---》上传失败!", originName);
|
// throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"上传失败!");
|
return false;
|
} finally {
|
if (ftpClient.isConnected()) {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {
|
log.error("disconnect fail ------->>>{}", e.getCause());
|
}
|
}
|
}
|
}
|
}
|