近期要做连接ftp的代码开发,老的账号密码忘了。所以只能在这里记载记载,谢谢
直接贴代码吧,基本注释写的都挺清晰的
#配置地址路径
public class Constants {
/**
* ftp请求ip
*/
// public static final String FTP_IP = "127.0.0.1";
public static final String FTP_IP = "103.79.24.30";
/**
* .gz
*/
public static final String GZ = ".gz";
public static final String FTP_ENCODE="UTF-8";
/**
* ftp端口号
*/
public static final int FTP_PORT = xxx;
/**
* 请求路径
*/
public static final String FTP_REQUEST="FTP/request/";
/**
* 返回路径
*/
public static final String FTP_RESPONSE="FTP/response/";
/**
* 返回文件名
*/
public static final String RESPONSE_GZ="_response.gz";
/**
* 导入到本地临时路径
*/
public static final String LOCAL_PATH="d:/";
}
工具类方法
public class FtpUntil {
private String ftpIp;
private int port;
private String ftpName;
private String ftpPwd;
//ftp对象
private FTPClient ftp;
private InputStream is = null;
private OutputStream os = null;
private FileOutputStream fos = null;
private FileInputStream fis = null;
public FtpUntil() {
}
public FtpUntil(String ftpIp, int port, String ftpName, String ftpPwd) {
this.ftpIp = ftpIp;
this.ftpName = ftpName;
this.ftpPwd = ftpPwd;
this.port = port;
}
public boolean connect() {
try {
ftp = new FTPClient();
ftp.connect(ftpIp, port);
System.out.println(ftp.login(ftpName, ftpPwd));
if (!ftp.login(ftpName, ftpPwd)) {
return false;
}
// 设置被动模式
ftp.enterLocalPassiveMode();
//设置以二进制方式传输
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setCharset(Charset.forName("UTF-8"));
ftp.setControlEncoding("UTF-8");
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 创建目录
*
* @param subfolderName 目录信息
* @return
*/
public boolean createDir(String subfolderName) {
String d = subfolderName;
try {
//目录编码,解决中文路径问题
d = new String(subfolderName.toString().getBytes("GBK"), "iso-8859-1");
//尝试切入目录
if (ftp.changeWorkingDirectory(d)) {
return true;
}
String[] arr = subfolderName.split("/");
StringBuffer sbfDir = new StringBuffer();
//循环生成子目录
for (String s : arr) {
sbfDir.append("/");
sbfDir.append(s);
//目录编码,解决中文路径问题
d = new String(sbfDir.toString().getBytes("GBK"), "iso-8859-1");
//尝试切入目录
if (ftp.changeWorkingDirectory(d)) {
continue;
}
if (!ftp.makeDirectory(d)) {
System.out.println("[失败]ftp创建目录:" + sbfDir.toString());
return false;
}
System.out.println("[成功]创建ftp目录:" + sbfDir.toString());
}
//将目录切换至指定路径
return ftp.changeWorkingDirectory(d);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 上传到指定路径
*
* @param uploadName 远程文件文件名
* @param localpath 本地文件路径
* @return
*/
public Resp upload(String uploadName, String localpath) {
try {
if (!connect()) {
return fail("", "ftp连接失败");
}
if(!(new File(localpath).exists())){
System.out.println();
return fail("", "本地路径文件不存在"+localpath);
}
OutputStream os = ftp.storeFileStream(uploadName);
fis = new FileInputStream(new File(localpath));
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
return fail("", "上传失败"+e);
} finally {
this.close();
}
return success("");
}
/**
* @param remotepath 远程地址文件路径
* @param localpath 本地文件路径
* @return
*/
public Resp download(String remotepath, String localpath) {
try {
if (!connect()) {
return fail("", "ftp连接失败");
}
FTPFile[] files =ftp.listFiles(remotepath);
if(files==null || files.length==0){
System.out.println("不存在"+remotepath);
return fail("", "不存在"+remotepath);
}
is = ftp.retrieveFileStream(remotepath);
fos = new FileOutputStream(new File(localpath));
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
}catch (NullPointerException e) {
System.out.println("没有找到" + remotepath + "文件");
e.printStackTrace();
return fail("", "没有找到" + remotepath + "文件");
} catch (IOException e) {
e.printStackTrace();
return fail("", "下载失败"+e);
} finally {
this.close();
}
return success("");
}
public boolean isExsits(String ftpPath){
try {
if (!connect()) {
return false;
}
FTPFile[] files =ftp.listFiles(ftpPath);
if(files!=null&&files.length>0){
System.out.println("files size:"+files[0].getSize());
return true;
}else {
return false;
}
} catch (Exception e) {
//重新连接一次,可以么?
try {
Thread.sleep(1000);
} catch (Exception e1) {
}
System.out.println("重新连接....");
ftp = null;
return isExsits(ftpPath);
//e.printStackTrace();
}
}
//关闭方法
private void close() {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException e) {
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}
}
}
这里一定要注意。因为这里我们的路径是包含文件的后缀的。
具体实现方法
public class FtpService {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
FtpService ff = new FtpService();
//导入
Object oo = ff.importFtp("2019042201", "fec3246cefb94d2592af6c4e9c257164", "888888", "E:\\xxx\\xxx\\xxx\\5W.csv.gz");
System.out.println("oo的值是:---" + oo + ",当前方法=FtpService.main()");
//导出
Object pp = ff.exportFtp("2019042201", "fec3246cefb94d2592af6c4e9c257164", "888888");
System.out.println("pp的值是:---" + pp + ",当前方法=FtpService.main()");
}
/**
* 导入到ftp指定文件夹
*
* @param entId ftp账户名
* @param requestId 这就是一个文件的路径,主要是为了识别上传的文件不重复所以才是全局唯一
* @param filePath 本地文件及路径
* @param entSecret ftp密码
* @return
*/
public Object importFtp(String entId, String entSecret, String requestId, String filePath) {
try {
FtpUntil ftp = new FtpUntil(Constants.FTP_IP, Constants.FTP_PORT, entId, entSecret);
boolean connect = ftp.connect();
if (!connect) {
return fail("", "ftp连接失败");
}
if (!filePath.endsWith(".gz")) {
return fail(APIConstants.CODE_FILE_ERROR, "", "请选择.gz文件");
}
ftp.createDir(Constants.FTP_REQUEST + entId);
Resp resp = ftp.upload(Constants.FTP_REQUEST + entId + "/" + requestId + Constants.GZ, filePath);
return resp;
} catch (Exception e) {
logger.error("[FtpService][importFtp] and fail" + e);
return fail("", "导入失败");
}
}
/**
* ftp导出到临时路径
*
* @param entId 用户名
* @param requestId 这就是一个文件的路径,主要是为了识别上传的文件不重复所以才是全局唯一
* @param entSecret 密码
* @return
*/
public Object exportFtp(String entId, String entSecret, String requestId) {
try {
FtpUntil ftp = new FtpUntil(Constants.FTP_IP, Constants.FTP_PORT, entId, entSecret);
boolean connect = ftp.connect();
if (!connect) {
return fail("", "ftp连接失败");
}
Resp resp = ftp.download(Constants.FTP_RESPONSE + entId + "/" + requestId + Constants.RESPONSE_GZ, Constants.LOCAL_PATH + requestId + Constants.RESPONSE_GZ);
return resp;
} catch (Exception e) {
logger.error("[FtpService][exportFtp] and fail" + e);
return fail("", "下载失败");
}
}
}