`
01jiangwei01
  • 浏览: 545608 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java ftp上传文件

    博客分类:
  • java
 
阅读更多
工具类:
 

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Properties;

/**
 * FTP文件上传、下载操作
 *
 * Created on 2017年12月19日17:49:02
 * @author lilongsheng
 * @since 1.0
 */
public final class FtpUtil {

    private static final Logger logger = LoggerFactory.getLogger(FtpUtil.class);

    public static final Properties CONFIG = getConfigProperties();
    public static final String PROTOCAL= "ftp://";
    public static final String REMOTE_ADDRESS = CONFIG.getProperty("ftp.sqyc.host");
    public static final String REMOTE_PATH = CONFIG.getProperty("ftp.sqyc.remotePath");
    public static final String REMOTE_PORT = CONFIG.getProperty("ftp.sqyc.port");
    private static final String PASSWORD = CONFIG.getProperty("ftp.sqyc.password");
    private static final String USER_NAME = CONFIG.getProperty("ftp.sqyc.name");

	private static Properties ftpPathConfig;

    private FTPClient ftpClient;

	private FtpUtil() { }

	public static FtpUtil getInstance() {
		return new FtpUtil();
	}

	public static Properties getConfigProperties() {
		if(CONFIG == null){
			Properties p = new Properties();
			try {
				p.load(FtpUtil.class.getResourceAsStream("/ftp.properties"));
				return p ;
			} catch (IOException e) {
				e.printStackTrace();
                logger.error("风控-上传下载异常-加载配置文件 error:{}",e.getMessage());
                return null;
			}

		}else{
			return CONFIG;
		}

	}

	/**
	 * 连接FTP服务器
	 * @param remotePath 远程访问路径
	 */
	public void connectServer(String remotePath) {
        String path=remotePath;
		try {
			if (path == null) {
				path = FtpUtil.REMOTE_PATH;
			}

			ftpClient = new FTPClient();

			if (REMOTE_PORT == null || 0 == Integer.parseInt(REMOTE_PORT)) {
				ftpClient.connect(REMOTE_ADDRESS);
			} else {
				ftpClient.connect(REMOTE_ADDRESS, Integer.parseInt(REMOTE_PORT));
			}

			int reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				// FTP server refused connection.
				closeConnect();
				System.exit(1);
			}

			ftpClient.login(USER_NAME, PASSWORD);
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			// login success !!!

			if (path.length() != 0) {
//				boolean flag =
                createDirecroty(path, ftpClient);

				/*if (flag) {
					// set working directory successful !!!
				}*/
			}
		} catch (IOException e) {
			// not login !!!
			e.printStackTrace();
		}
	}

	public void connectServer() {
		connectServer(null);
	}

    /**
     * 关闭与FTP服务器之间的连接
     */
	public void closeConnect() {
		try {
			ftpClient.disconnect();
			// disconnect success !!!
		} catch (IOException e) {
			// not disconnect !!!
			e.printStackTrace();
		}
	}

    /**
     * 创建工作目录,并将当前工作目录定位到新创建的目录
     * 采用一次命令创建一个文件夹的方式,已兼容 IBM FTP
     * @param path 要创建的目录路径
     * @return 是否操作成功
     * @throws java.io.IOException
     */
	public boolean alertWorkingDirectory(String path) throws IOException {
		boolean flag = ftpClient.changeWorkingDirectory(path);
		if (!flag) {
			String[] ps = path.split("/");
            for (String p : ps) {
                if (!ftpClient.changeWorkingDirectory(p)) {
                    if (ftpClient.makeDirectory(p)) {
                        flag = ftpClient.changeWorkingDirectory(p);
                    } else {
                        flag = false;
                        break;
                    }
                }
            }
		}
		return flag;
	}

	/**
	 * Description: 递归创建远程服务器目录
	 *
	 * @param remote
	 *            远程服务器文件绝对路径
	 * @param ftpClient
	 *            FTPClient 对象
	 * @return boolean 目录创建是否成功
	 * @throws java.io.IOException
	 */
	public boolean createDirecroty(String remote, FTPClient ftpClient)
			throws IOException {
		boolean status = false;
		String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
		if (!directory.equalsIgnoreCase("/")
				&& !ftpClient.changeWorkingDirectory(new String(directory
						.getBytes("utf-8"), "iso-8859-1"))) {
			// 如果远程目录不存在,则递归创建远程服务器目录
			int start;
			int end;
			if (directory.startsWith("/")) {
				start = 1;
			} else {
				start = 0;
			}
			end = directory.indexOf("/", start);
			while (true) {
				String subDirectory = new String(remote.substring(start, end)
						.getBytes("utf-8"), "iso-8859-1");
				if (!ftpClient.changeWorkingDirectory(subDirectory)) {
					if (ftpClient.makeDirectory(subDirectory)) {
						ftpClient.changeWorkingDirectory(subDirectory);
					} else {
						// 创建目录失败
						return status;
					}
				}

				start = end + 1;
				end = directory.indexOf("/", start);

				// 检查所有目录是否创建完毕
				if (end <= start) {
					break;
				}
			}
		}

		status = true;
		return status;
	}

	/**
	 * 文件上传
	 * @param path 文件保存路径
	 * @param fileName 文件名称
	 * @param inputStream 文件流
	 * @return 操作是否成功
	 */
	public boolean upload(String path, String fileName, InputStream inputStream) {

		boolean flag = false;
		try {
			createDirecroty(path, ftpClient);
			flag = ftpClient.storeFile(fileName, inputStream);
			/*if (flag) {
				// upload success !!!
			}*/
		} catch (IOException e) {
			// not upload !!!
			e.printStackTrace();
		}
		return flag;
	}

	/**
	 * 根据传入的路径建立输出流
	 * @Version1.0 2014-7-9 上午11:55:14 by 张延伟(yw.zhang02@zuche.com)创建
	 * @param path 文件保存路径
	 * @param fileName 文件名称
	 * @return
	 */
	public OutputStream storeFileStream(String path, String fileName) {
		OutputStream os = null;
		try {
			createDirecroty(path, ftpClient);
			os = ftpClient.storeFileStream(fileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return os;
	}

	/**
	 * 判断文件是否存在
	 * @param path 文件路径
	 * @param fileName 文件名称
	 * @return ture:存在 false:不存在
	 */
	public boolean isFileExist(String path, String fileName){
		try {
			boolean cdStatus = ftpClient.changeWorkingDirectory(new String(path.getBytes("utf-8"), "iso-8859-1"));
			if(!cdStatus){
				return false;
			}else {
				String[] fileNames = ftpClient.listNames();
				return Arrays.binarySearch(fileNames, fileName) > -1;
			}
		} catch (Exception e) {
            e.printStackTrace();
            logger.error("风控-上传下载异常-文件是否存在 error:{}",e.getMessage());
            return false;
		}

	}

	/**
	 * 文件下载
	 * @param fileName 文件的完整路径
	 * @return 下载到的文件流
	 */
	public InputStream download(String fileName) {
		InputStream inputStream = null;
		try {
			inputStream = ftpClient.retrieveFileStream(fileName);
		} catch (IOException e) {
			// not download !!!
			e.printStackTrace();
		}
		return inputStream;
	}

	/**
	 * Description: 获取FTP服务器上文件存储目录
	 *
	 * @param type
	 *            文件所属模块类型
	 * @return 文件服务器端路径
	 */
	public static String getRemoteFileDir(int type){

		StringBuilder remoteFileDir = new StringBuilder();

		remoteFileDir.append(getFtpPathConfig().getProperty(String.valueOf(type)));
		SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");

		String datePath = sf.format(new Date());

		remoteFileDir.append(datePath).append("/");

		return remoteFileDir.toString();
	}

    private static Properties getFtpPathConfig(){
        synchronized (FtpUtil.class) {
            if (ftpPathConfig == null) {
                Properties p = new Properties();
                InputStream in = null;
                try {
                    in = FtpUtil.class.getResourceAsStream("/ftpUploadPathConfig.properties");
                    p.load(in);
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error("风控-上传下载异常-文件路径配置 error:{}",e.getMessage());
                }finally{
                    if(in != null){
                        try {
                            in.close();
                        } catch (IOException e) {
                            in = null;
                        }
                    }
                }
                ftpPathConfig = p;
            }
        }

        return ftpPathConfig;
    }

    public boolean completePendingCommand(){
        try {
            return ftpClient.completePendingCommand();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("风控-上传下载异常-执行命令 error:{}",e.getMessage());
            return false;
        }
    }

}



使用方法:
FtpUtil ftpUtil = FtpUtil.getInstance();
        try {
            String extension = FilenameUtils.getExtension(uploadFile.getOriginalFilename());
            String uuid = UUID.randomUUID().toString();
            String timeStamp = System.currentTimeMillis() + "";
            String filePathDir = getRemoteFileDir();

            //开始上传
            ftpUtil.connectServer();
            boolean uploadFlag = ftpUtil.upload(filePathDir, uuid + "_" + timeStamp + "." + extension, uploadFile.getInputStream());
            if (uploadFlag){
                 ok = true;
                 absoluteUrl = FtpUtils.getFtpServerUrl() + filePathDir + uuid + "_" + timeStamp + "." + extension;
                 oppositeUrl = filePathDir + uuid + "_" + timeStamp + "." + extension;
                 logger.info(" 上传订单附件-absoluteUrl:{" + absoluteUrl + "},oppositeUrl:{" + oppositeUrl + "}");
            }

        } catch (Exception e) {
            e.printStackTrace();
            logger.error(" 上传订单附件-异常 error:{"+e.getMessage() +"}");
        }finally {
            ftpUtil.closeConnect();
        }
分享到:
评论

相关推荐

    pimpinella_3cd_01_0716.pdf

    pimpinella_3cd_01_0716

    FIB English learning

    FIB English learning

    linux下 jq 截取json文件信息

    X86-jq安装包

    [AB PLC例程源码][MMS_046356]SELX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    大圣挪车小程序1.3.5+前端.zip

    大圣挪车小程序1.3.5 前端

    Manus.im 产品及开发团队研究报告.pdf

    Manus.im 产品及开发团队研究报告.pdf

    [AB PLC例程源码][MMS_044663]Control daisy chain wiring in Fieldbus Foundation.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01a_0918.pdf

    sun_3ck_01a_0918

    支持适用于PERC H330/H730/H730P/H830/H730P系列RAID卡MX/FD33xD/FD33xS控制器的驱动安装指南

    下载 1. 单击“立即下载”,以下载该文件。 2. 出现“文件下载”窗口后,单击“保存”,以将文件保存到硬盘。 安装 1. 浏览至文件下载目标位置并双击新下载的文件。 2. 仔细阅读对话窗口中显示的发布信息。 3. 下载并安装对话窗口中标识的任何必备项,然后再继续。 4. 单击“Install”(安装)按钮。 5. 按照其余提示执行更新。 安装 1. 将解压的文件复制到可访问Windows的介质。 2. 将系统重新引导至Windows操作系统。 3. 打开“服务器管理器”->“设备管理器”->“存储控制器”,然后单击“PERC控制器”。 5. 单击“更新驱动程序软件”,并按照提示更新驱动程序。 4. 重新引导系统以使更改生效。

    硬盘安装器,支持硬盘安装,无需制作U盘PE!

    支持所有操作系统一键安装。

    matlab程序代码项目案例:使用 Simulink 进行自适应 MPC 设计

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_044098]1769-ASCII Simultaneous Mode.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    swanson_01_1106.pdf

    swanson_01_1106

    [AB PLC例程源码][MMS_047811]SAF1 - Store.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    sun_3ck_01_0919.pdf

    sun_3ck_01_0919

    方言距离数据.岭南学院产业与区域经济研究中心

    各城市方言距离数据-中山大学岭南学院产业与区域经济研究中心 方言距离是指两种或多种方言之间的相似程度或差异程度。参考中山大学岭南学院产业与区域经济研究中心的刘毓芸等(2015)文献。他们基于方言树图,并参考《汉语方言大词典》和《中国语言地图集》对方言的划分,将汉语方言从宽泛到具体分为以下几个层级:汉语→方言大区→方言区→方言片。为了量化县与县之间的方言差异,他们采用了一种赋值方法: 若它们分属不同方言大区,则距离为3。: 若两个县同属一个方言片,则它们之间的方言距离为0; 若两个县属于同一方言区但不同方言片,则距离为1; 若它们属于同一方言大区但不同方言区,则距离为2; 方言距离是一个反映方言之间相似程度或差异程度的重要指标,它在语音识别、方言研究等领域具有广泛的应用价值。 参考文献:[1]刘毓芸, 徐现祥, 肖泽凯. 2015. 劳动力跨方言流动的倒U型模式[J]. 经济研究, 50(10): 134-146+162. 指标 语系、语族、方言大区、方言区/语支、方言片/语种、Supergroup、Dialect、group、Sub-dialect、groupPref_1、Pref_2、DiaDist、PrefCode_1、PrefCode_2等等。

    基于PCA算法的人脸识别MATLAB源码

    基于PCA算法的人脸识别MATLAB源码

    [AB PLC例程源码][MMS_045740]Handling manual movement of axis using an Add On Instruction (AOI), .zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    lim_3ck_01a_0518.pdf

    lim_3ck_01a_0518

Global site tag (gtag.js) - Google Analytics