`
01jiangwei01
  • 浏览: 542991 次
  • 性别: 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();
        }
分享到:
评论

相关推荐

    java实现的ftp文件上传

    - **上传文件**:调用`FTPClient.storeFile()`或`FTPClient.uploadFile()`方法上传文件。 - **断开连接**:最后,记得调用`FTPClient.logout()`和`FTPClient.disconnect()`断开连接并释放资源。 在开发过程中,还...

    Java实现FTP文件上传和下载

    5. **文件上传**:使用`storeFile()`方法上传文件。你需要提供远程文件路径和一个InputStream,这个InputStream通常来自本地文件。 ```java File localFile = new File("C:\\local\\file.txt"); InputStream in = ...

    javaftp上传文件.txt

    javaftp上传文件.txt javaftp上传文件.txt javaftp上传文件.txt

    java ftp上传 下载 文件压缩解压

    这篇博客“java ftp上传 下载 文件压缩解压”很可能是关于如何使用Java实现FTP文件上传、下载以及文件的压缩与解压功能。下面我们将深入探讨这些知识点。 首先,FTP上传和下载是Java中常见的任务,通常通过`java...

    java使用FTP上传文件

    java使用FTP上传文件,非常实用 包括创建ftp链接,上传

    FTPUpload上传文件 进度条显示进度

    在Java编程环境中,FTP(File Transfer Protocol)上传文件并实现进度条显示是一个常见的需求,尤其在用户界面设计中。下面将详细讲解如何使用Java的Swing库创建一个带有进度条的FTP文件上传功能。 首先,我们需要...

    Java实现FTP批量大文件上传下载

    上传小于 1M 文件速度要比用 FTP 协议上传文件略快。但对于批量及大文件的传输可能无能为力。后来决定采用 FTP 协议上传文件大于 1M 的文件速度比 HTTP 快。文件越大,上传的速度就比 HTTP 上传的速度快数倍。 二、...

    java FTP上传文件,下载文件

    - `uploadFile(String remoteFilePath, File localFile)`: 上传文件到FTP服务器。 - `downloadFile(String remoteFilePath, File localFile)`: 从FTP服务器下载文件到本地。 - `disconnect()`: 断开与FTP服务器的...

    java上传文件到ftp.txt

    ### Java上传文件到FTP知识点详解 #### 一、概述 在现代软件开发中,文件传输是一项常见的需求。其中,FTP(文件传输协议)是最常用的一种文件传输方式之一。本篇文章将详细阐述如何利用Java编程语言实现本地文件...

    java实现ftp自动上传文件

    Java 实现 FTP 自动上传文件是一项常见的任务,尤其在自动化部署、数据同步或者日志传输等场景中。本文将深入探讨如何使用Java编程语言来构建一个FTP文件上传系统,同时结合Log4j日志框架和命令行信息的处理。 首先...

    java编写的ftp文件实时监控下载上传

    用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...

    Java FTP 指定下载文件和上传文件到指定的服务器目录

    ### Java FTP 指定下载文件和上传文件到指定的服务器目录 #### 一、概述 在本篇文章中,我们将详细介绍如何使用Java编程语言通过FTP(文件传输协议)实现文件的上传与下载功能,并能够将文件指定上传或下载到特定...

    java 连接 FTP 文件操作(上传,下载,删除,复制

    本文将详细讨论如何使用Java连接FTP(File Transfer Protocol)服务器,进行文件的上传、下载、删除以及复制等操作。 首先,Java通过`java.net`和`javax.net`包提供了FTP客户端的功能。主要依赖于`java.net....

    java大文件上传至ftp服务器带进度条显示的

    这个场景中,我们关注的重点是如何在上传过程中显示进度条,并确保该进度条与FTP上传的速度同步,以提供用户友好的交互体验。 在Java中,我们可以使用`java.net`或`org.apache.commons.net`库来实现FTP文件上传。...

    Java实现FTP批量大文件上传下载.pdf

    Java实现FTP批量大文件上传下载 一、Java FTP客户端库的选择 在选择Java FTP客户端库时,需要考虑多个因素,例如性能、安全性、可靠性等。当前有多种FTP客户端库可供选择,例如J-FTP、SimpleFTP、FTPClient等。每...

    java ftp上传进行文件

    java ftp上传进行文件的读取和上传 上传单个文件的文件流 创建远程服务器目录 删除指定文件 上传单个文件 获取指定ftp目录下文件名

    Java FTP文件上传下载

    `FtpUtil.java`很可能是一个封装了FTP操作的类,包括连接FTP服务器、登录、设置工作目录、上传文件、下载文件、断开连接等方法。这些方法通过调用Java的`java.net.Socket`类和`commons-net-1.4.1.jar`库中的FTP相关...

    java ftp 上传 IIS 展示,代码+文档

    Java FTP(File Transfer...总的来说,Java FTP上传IIS的实现涉及到Java网络编程、FTP协议、可能的第三方库使用,以及良好的异常管理和资源管理实践。通过合理的工具类设计,可以创建出高效且易于维护的FTP客户端代码。

Global site tag (gtag.js) - Google Analytics