本地文件上传FTP服务器,本地建了FTP服务器,可上传,连接别人的本地FTP服务器也能上传,测试环境不能
直接贴代码
FtpUtil类:
import com.htsc.zggz.config.FtpConfig;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import org.apache.poi.util.IOUtils;
import java.io.*;
/**
-
ftp工具类
*/
public class FtpUtil {
private static FTPClient ftp;
private static FtpConfig ftpCfg;
private static Logger logger = Logger.getLogger(FtpUtil.class);public FtpUtil(FtpConfig ftpCfg) {
this.ftpCfg = ftpCfg;
this.ftp = new FTPClient();
}
/* *
* ftp服务登录
*
* @return*/
public static boolean open() throws Exception {
//ftp已连接
if (ftp.isConnected()) {
return true;
}
ftp.connect(ftpCfg.getFtpIp(), ftpCfg.getFtpPort());
logger.info("连接到ftp服务器:" + ftpCfg.getFtpIp() + " 成功,开始登录....");
ftp.login(ftpCfg.getFtpName(), ftpCfg.getFtpPassword());
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
logger.debug("登录FTP服务器失败!");
throw new Exception("登录FTP服务器失败!");
}
return true;
}
/* *
* 关闭FTP连接*/
public static void close() throws Exception {
if (!ftp.isConnected()) {
return;
}
try {
ftp.logout();
} catch (IOException e) {
throw new Exception("退出FTP服务器失败!");
} finally {
if (ftp.isConnected()) {
ftp.disconnect();
}
}
}
public static boolean upload(String localDirectoryAndFileName) throws Exception {
if (!ftp.isConnected()) {
return false;
}
boolean flag = false;
if (ftp != null) {
File srcFile = new File(localDirectoryAndFileName);
String ftpFileName = srcFile.getName();
FileInputStream fis = null;
try {
fis = new FileInputStream(srcFile);
// 设置上传路径
String path = ftpCfg.getFtpHostPath();
// 检查上传路径是否存在 如果不存在返回false
boolean flag1 = ftp.changeWorkingDirectory(path);
if (!flag1) {
// 创建上传的路径
ftp.makeDirectory(path);
}
// 指定上传路径
ftp.changeWorkingDirectory(path);
// 设置文件类型
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
// 上传
flag = ftp.storeFile(new String(ftpFileName.getBytes(), "utf-8"), fis);
} catch (Exception e) {
FtpUtil.close();
logger.error("上传失败", e);
return false;
} finally {
try {
fis.close();
} catch (IOException e) {
logger.error("IO错误", e);
}
}
}
logger.info("上传的本地文件全路径: " + localDirectoryAndFileName);
return flag;
}
}
FtpConfig是配置文件对应建立的实体.
方法贴上:
import com.htsc.zggz.business.FtpUploadService;
import com.htsc.zggz.business.Result;
import com.htsc.zggz.config.FtpConfig;
import com.htsc.zggz.dao.FtpUploadDao;
import com.htsc.zggz.util.FileUtil;
import com.htsc.zggz.util.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.;
import static com.htsc.zggz.util.FtpUtil.close;
@Service
public class FtpUploadServiceImpl implements FtpUploadService {
private final Logger logger = LoggerFactory
.getLogger(PushDataHandlerImpl.class);
@Autowired
private FtpUploadDao ftpUploadDao;
@Autowired
private FtpConfig ftpConfig;
private String localDirectoryAndFileName;
private static final String TEMP_DIR = "targetFile";
/**
* 文件上传FTP服务器
*
* @return
*/
public Result FtpUpload() {
FTPClient ftp = new FTPClient();
FtpUtil ftpUtil = new FtpUtil(ftpConfig);
try {
WriteIntoExcel();
} catch (Exception e) {
logger.error("创建本地excel文件失败", e);
return new Result(Result.StateCodes.ERROR, "写入excel失败");
}
boolean flag = false;
//登录失败
try {
flag = FtpUtil.open();
} catch (Exception e) {
logger.error("登录失败错误信息", e);
return new Result(Result.StateCodes.ERROR, "登录失败");
}
//登录成功
boolean upload;
if (flag) {
try {
upload = FtpUtil.upload(localDirectoryAndFileName);
if (!upload) {
logger.info("执行上传语句返回false,上传失败");
return new Result(Result.StateCodes.ERROR, "上传失败");
}
} catch (Exception e) {
logger.error("上传文件失败", e);
return new Result(Result.StateCodes.ERROR, "上传失败");
} finally {
try {
close();
// FileUtil.deletefile(localDirectoryAndFileName);
} catch (Exception e) {
logger.error("FTP服务器退出失败", e);
}
}
logger.info("上传 " + ftpConfig.getFtpIp() + " :" + ftpConfig.getFtpHostPath() + " 结束");
}
return new Result(Result.StateCodes.SUCCESS, "上传成功");
}
/**
* 生成文件名和唯一UUID
*
* @return
*/
public String getFileNamePrefix() {
String DATE_LEFT_PARENT = "{";
String DATE_RIGHT_PARENT = "}";
String DATE_SPLIT_CHAR = "_";
String DATE_PARENT = "_YYYYMMDD_";
String STRING_UUID = "UUID";
//计算当前日期,生成UUID
SimpleDateFormat df = new SimpleDateFormat("YYYYMMDD");
String format = df.format(System.currentTimeMillis());
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String fileNamePrefix = ftpConfig.getFileNamePrefix();
String prefixName = fileNamePrefix.replace(DATE_LEFT_PARENT, DATE_SPLIT_CHAR)
.replace(DATE_RIGHT_PARENT, DATE_SPLIT_CHAR);
fileNamePrefix = prefixName.replaceAll(DATE_PARENT, format).replaceAll(STRING_UUID, uuid);
return fileNamePrefix;
}
/**
* 生成excel表格并插入数据
*/
public void WriteIntoExcel() throws Exception {
File dir = FileUtil.getNewNameFile(TEMP_DIR);
while (!dir.exists()) {
dir.mkdirs();
}
FileOutputStream output = null;
try {
HSSFWorkbook wb = new HSSFWorkbook();
//建立新的sheet对象(excel的表单)
HSSFSheet sheet = wb.createSheet();
//在sheet里创建第一行
HSSFRow row1 = sheet.createRow(0);
//创建单元格
HSSFCell cell = row1.createCell(0);
//设置缺省列高
sheet.setDefaultRowHeightInPoints(25);
//设置缺省列宽
sheet.setDefaultColumnWidth(20);
//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
//在sheet里创建第二行
HSSFRow row2 = sheet.createRow(1);
//创建单元格并设置单元格内容
row2.createCell(0).setCellValue("名称");
row2.createCell(1).setCellValue("组合名称");
row2.createCell(2).setCellValue("市场");
row2.createCell(3).setCellValue("代码");
row2.createCell(9).setCellValue("类型");
row2.createCell(10).setCellValue("数量");
row2.createCell(12).setCellValue("日期");
List<Map<String, Object>> list = ftpUploadDao.seach();
for (int i = 0; i < list.size(); i++) {
Map<String, Object> objectMap = list.get(i);
//在sheet里循环创建 多行
HSSFRow row = sheet.createRow(i + 2);
//对应行的列里面循环塞值
//基金名称
row.createCell(0).setCellValue((String) objectMap.get("名称"));
//投资组合名称
row.createCell(1).setCellValue((String) objectMap.get("组合名称"));
//市场
row.createCell(2).setCellValue((String) objectMap.get("市场"));
//证券代码
row.createCell(3).setCellValue((String) objectMap.get("代码"));
//业务类型
row.createCell(9).setCellValue((String) objectMap.get("类型"));
//发生数量
row.createCell(10).setCellValue(String.valueOf((BigDecimal) objectMap.get("数量")));
//操作生效日期
row.createCell(12).setCellValue((String) objectMap.get("日期"));
}
localDirectoryAndFileName = TEMP_DIR + File.separator + getFileNamePrefix();
File outPutFile = new File(localDirectoryAndFileName);
outPutFile.createNewFile();
output = new FileOutputStream(outPutFile);
wb.write(output);
} catch (Exception e) {
logger.error("excel写入失败", e);
throw new Exception("excel写入失败");
} finally {
try {
output.close();
} catch (Exception e) {
logger.error("IO错误", e);
}
}
}
}
问题:
本地文件上传FTP服务器,本地建了FTP服务器,可上传,连接别人的本地FTP服务器也能上传,测试环境返回成功,但是却生成不了文件.也不报错.