如果写入文件到ftp时要改变编码的话用 ftpClient.setAutodetectUTF8(true);而不是string.getbates("utf-8").编码影响到了md5,sha等加密的值。亲试过的坑
import com.vividsolutions.jts.io.InputStreamInStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import java.io.*;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class FtpUtils {
private static final Logger logger = LoggerFactory.getLogger(FtpUtils.class);
public FTPClient ftpClient = null;
/**
* 初始化ftp服务器
*/
public boolean initFtpClient() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
logger.info("连接ftp服务器:"+ BaseParamConfig.hostname+":"+BaseParamConfig.port);
ftpClient.connect(BaseParamConfig.hostname, BaseParamConfig.port); //连接ftp服务器
ftpClient.login(BaseParamConfig.username, BaseParamConfig.password); //登录ftp服务器
int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
if(!FTPReply.isPositiveCompletion(replyCode)){
logger.error("【清分】连接失败...ftp服务器:");
return false;
}
logger.info("连接成功...ftp服务器:");
}catch (MalformedURLException e) {
e.printStackTrace();
logger.error("【清分】连接出现异常-----"+e.getMessage());
return false;
}catch (IOException e) {
e.printStackTrace();
logger.error("【清分】连接出现异常-----"+e.getMessage());
return false;
}
return true;
}
/**
* 把文件写入到ftp
* startName 开始文件名
* path 路劲
* fileContent 内容
* fileName 文件名全名
*/
public boolean writeFile(String path,String fileContent,String fileName,String startName){
logger.info("开始执行写入--"+"路径: "+path +" 文件名:"+fileName);
InputStream is = null;
try {
// 1.输入流
is = new ByteArrayInputStream(fileContent.getBytes());
// Inputin = new InputStreamInStream(is);
// 4.指定写入的目录
ftpClient.changeWorkingDirectory(path);
FTPFile[] ftpFiles = ftpClient.listFiles();
//因为文件经过加密 密值都不同 覆盖不了原先文件 所以要先删除当日之前上传过的文件
for (int i = 0; i < ftpFiles.length; i++) {
String name = ftpFiles[i].getName();//文件名
if (name.startsWith(startName)) {
ftpClient.dele(name);
logger.info("删除了文件:{}",name);
}
}
//5.写操作
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
ftpClient.setAutodetectUTF8(true);
ftpClient.storeFile(fileName, is);
FTPFile[] ftpFiles2 = ftpClient.listFiles();
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
logger.warn("【清分】写入文件时出现异常---"+e.getMessage());
return false;
}finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (Exception e) {
e.printStackTrace();
logger.warn("【清分】写入文件时出现异常---"+e.getMessage());
return false;
}
}
}
return true;
}
/**
* 上传文件
* @param pathname ftp服务保存地址
* @param fileName 上传到ftp的文件名
* @param originfilename 待上传文件的名称(绝对地址) *
* @return
*/
public boolean uploadFile( String pathname, String fileName,String originfilename){
boolean flag = false;
InputStream inputStream = null;
try{
System.out.println("开始上传文件");
inputStream = new FileInputStream(new File(originfilename));
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
System.out.println("上传文件成功");
}catch (Exception e) {
System.out.println("上传文件失败");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* 上传文件
* @param pathname ftp服务保存地址
* @param fileName 上传到ftp的文件名
* @param inputStream 输入文件流
* @return
*/
public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
boolean flag = false;
try{
System.out.println("开始上传文件");
initFtpClient();
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
System.out.println("上传文件成功");
}catch (Exception e) {
System.out.println("上传文件失败");
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
//改变目录路径
public boolean changeWorkingDirectory(String directory) {
boolean flag = true;
try {
flag = ftpClient.changeWorkingDirectory(directory);
if (flag) {
System.out.println("进入文件夹" + directory + " 成功!");
} else {
System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return flag;
}
//创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
public boolean CreateDirecroty(String remote) throws IOException {
boolean success = true;
String directory = remote + "/";
// 如果远程目录不存在,则递归创建远程服务器目录
if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {
int start = 0;
int end = 0;
if (directory.startsWith("/")) {
start = 1;
} else {
start = 0;
}
end = directory.indexOf("/", start);
String path = "";
String paths = "";
while (true) {
String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
path = path + "/" + subDirectory;
if (!existFile(path)) {
if (makeDirectory(subDirectory)) {
changeWorkingDirectory(subDirectory);
} else {
System.out.println("创建目录[" + subDirectory + "]失败");
changeWorkingDirectory(subDirectory);
}
} else {
changeWorkingDirectory(subDirectory);
}
paths = paths + "/" + subDirectory;
start = end + 1;
end = directory.indexOf("/", start);
// 检查所有目录是否创建完毕
if (end <= start) {
break;
}
}
}
return success;
}
//判断ftp服务器文件是否存在
public boolean existFile(String path) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftpClient.listFiles(path);
if (ftpFileArr.length > 0) {
flag = true;
}
return flag;
}
//创建目录
public boolean makeDirectory(String dir) {
boolean flag = true;
try {
flag = ftpClient.makeDirectory(dir);
if (flag) {
System.out.println("创建文件夹" + dir + " 成功!");
} else {
System.out.println("创建文件夹" + dir + " 失败!");
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 根据条件模糊查询文件
* pathname linux绝对路径
* filename 开头字符串 如:Q_20181011
*/
public FtpSettleVO likeFileList(String pathname, String filename, String endFileName) {
FtpSettleVO settleVO = new FtpSettleVO();
logger.info("开始读取回盘的文件---"+"路径:"+pathname +" 开头名:"+filename+" 结束名: "+endFileName);
List<String > lists = new ArrayList<>();
try {
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
//现在只做读取单个就退出
for (int i = 0; i < ftpFiles.length; i++) {
String name = ftpFiles[i].getName();//文件名
logger.info("正在读取的文件名称---"+name);
if (name.startsWith(filename)&&name.endsWith(endFileName)) {
logger.info("正在执行的文件名称---"+name);
InputStream ins = null;
StringBuilder builder = null;
String str="";
try {
// 从服务器上读取指定的文件
ins = ftpClient.retrieveFileStream(ftpFiles[i].getName());
BufferedReader reader = new BufferedReader(new InputStreamReader(ins, "utf-8"));
String line;
builder = new StringBuilder();
int s=0;
while ((line = reader.readLine()) != null) {
if (s>0){
builder.append("\n");
}
lists.add(line);
builder.append(line);
s++;
}
str = builder.toString();
str = new String(str.getBytes("gbk"));
reader.close();
if (ins != null) {
ins.close();
} //主动调用一次getReply()把接下来的226消费掉. 这样做是可以解决这个返回null问题
ftpClient.getReply();
} catch (Exception e) {
e.printStackTrace();
settleVO.setExMessage(e.toString()+":"+e.getMessage());
logger.warn("执行读取文件出现异常-----"+e.getMessage());
}
settleVO.setFileName(name);
settleVO.setConten(str);
settleVO.setList(lists);
return settleVO;
}
}
ftpClient.logout();
settleVO.setList(lists);
return settleVO;
} catch (IOException e) {
e.printStackTrace();
settleVO.setExMessage(e.toString()+":"+e.getMessage());
logger.warn("【清分】读取文件时出现异常-----"+e.getMessage());
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
settleVO.setExMessage(e.toString()+":"+e.getMessage());
logger.warn("【清分】读取文件时出现异常-----"+e.getMessage());
}
}
}
return settleVO;
}
/** * 下载文件 *
* @param pathname FTP服务器文件目录 *
* @param filename 文件名称 *
* @param localpath 下载后的文件路径 *
* @return */
public boolean downloadFile(String pathname, String filename, String localpath){
boolean flag = false;
OutputStream os=null;
try {
System.out.println("开始下载文件");
initFtpClient();
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
File localFile = new File(localpath + "/" + file.getName());
os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
System.out.println("下载文件成功");
} catch (Exception e) {
System.out.println("下载文件失败");
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/** * 删除文件 *
* @param pathname FTP服务器保存目录 *
* @param filename 要删除的文件名称 *
* @return */
public boolean deleteFile(String pathname, String filename){
boolean flag = false;
try {
System.out.println("开始删除文件");
initFtpClient();
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
System.out.println("删除文件成功");
} catch (Exception e) {
System.out.println("删除文件失败");
e.printStackTrace();
} finally {
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
}
return flag;
}
public static void main(String[] args) {
FtpUtils ftp =new FtpUtils();
ftp.initFtpClient();
ClearingVO clea = new ClearingVO();
clea.setMerchant("00023155");
clea.setMerchantName("大神");
clea.setDate(DateUtil.getYYYYMMDD(new Date()));
String number = Myutil.formatDate();
clea.setOrderNo(number);
clea.setBankNo("");
clea.setAccountName("张三");
clea.setAccount("6210985800000004763");
clea.setMoney("10000");
clea.setSummary("无摘要");
clea.setRemark("这笔是正确的");
List<ClearingVO> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
list.add(clea);
}
//模拟清分
StringBuilder str = new StringBuilder();
str.append("30");//总笔数
str.append("|");
str.append("300000");//总金额
str.append("|");
int a =0;
for (ClearingVO c:list) {
a++;
str.append("\n");
str.append(a);//清分id
str.append("|");
str.append(Myutil.toString(c.getMerchant()));//商户号
str.append("|");
str.append(Myutil.toString(c.getMerchantName()));//商户名
str.append("|");
str.append(c.getDate());//订单日期
str.append("|");
str.append(c.getOrderNo()+a);//订单号
str.append("|");
str.append(Myutil.toString(c.getBankNo()));//支付行号
str.append("|");
str.append(Myutil.toString(c.getAccountName()));//收款人姓名
str.append("|");
str.append(Myutil.toString(c.getAccount()));//收款账号
str.append("|");
str.append(Myutil.toString(c.getMoney()));//清分金额
str.append("|");
str.append(Myutil.toString(c.getSummary()));//摘要
str.append("|");
str.append(Myutil.toString(c.getRemark()));//备注
str.append("|");
}
// System.out.println(str.toString());
//文件名 文件名规格 请求文件名 QS_YYYYMMDDNNN_XXX_Q.txt
// String fileName ="QS_"+DateUtil.getYYYYMMDD(new Date())+"001"+"_001"+"_Q.txt";
/**
* 把内容写成TXT 传到ftp
*/
// boolean result = ftp.writeFile("/zcode",str.toString(),fileName);
// boolean result = ftp.writeFile("/postal",str.toString(),"ftp.txt");
// System.out.println(result);
/**
* 根据模糊条件读取ftp文件
*/
// String fileName ="QS_"+DateUtil.getYYYYMMDD(new Date())+"001"+"_001"+"_R.txt";
String fileName ="QS_20181017";
List<String > lists = ftp.likeFileList("/postal",fileName,"001_R.txt");
}