Java中向ftp上传下载文件

Posted 糊涂虫暴打了荷包蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中向ftp上传下载文件相关的知识,希望对你有一定的参考价值。

最近的一个项目跟ftp打交道很多,经常需要向ftp上传、下载文件,现在总结一下公共方法。

上传

/**
     * 文件上传
     * 
     * @param ip
     *            host
     * @param port
     *            端口
     * @param userName
     *            用户名
     * @param passWord
     *            密码
     * @param localpath
     *            上传文件在本地磁盘路径
     * @param fileName
     *            文件名
     * @param remotePath
     *            文件要上传到ftp服务器的路径
     * @throws Exception
     */
    public static Boolean fileFtpUpload(String ip, int port, String userName,
            String passWord, String localpath, String fileName,
            String remotePath) throws Exception {
        FTPClient ftp = new FTPClient();// 创建客户端对象
        InputStream local = null;
        boolean flag = false;
        try {
            checkIsExsitFile(localpath, fileName);// 判断本地路径下有无该文件
            SocketAddress address = new InetSocketAddress(ip, port);
            ftp.connect(ip, port);// 连接
            ftp.login(userName, passWord);// 登录
            log.info("ftp服务器连接、登陆成功,地址为:" + address);
            // 检查上传路径是否存在 如果不存在返回false
            boolean flag1 = ftp.changeWorkingDirectory(remotePath);
            if (!flag1) {
                // 创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image
                // ftp.makeDirectory(path);
                throw new Exception("ftp服务器上没有指定文件目录,请先创建:" + remotePath);
            }
            // 指定上传路径
            ftp.changeWorkingDirectory(remotePath);
            // 指定上传文件的类型 二进制文件
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            // 读取本地文件
            File file = new File(localpath + "\\" + fileName);
            local = new FileInputStream(file);
            // 第一个参数是文件名
            ftp.storeFile(file.getName(), local);
            log.info("上传成功");
            flag = true;
        } catch (SocketException e) {
            log.info("上传失败" + e);
            flag = false;
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭文件流
                local.close();
                // 退出
                ftp.logout();
                // 断开连接
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

上传文件之前需要先判断磁盘下有无指定文件,判断方法如下:

/**
	 * 判断文件路径下有无指定文件
	 * 
	 * @param filePath
	 *            生成文件名称
	 * @param fileName
	 *            文件名称
	 * @return 是否创建成功,成功则返回true
	 */
	public static void checkIsExsitFile(String filePath, String fileName) {
		File dirFile = new File(filePath);// 文件夹对象
		try {
			File[] files = dirFile.listFiles();
			Boolean bl = false;
			for (File file1 : files) {
				if (fileName.equals(file1.getName())) {
					bl = true;
					break;
				}
			}
			// 如果文件夹内文件不存在,则报错
			if (!bl) {
				throw new Exception("文件路径下没有指定上传文件");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

注意在上传之前一定要先切换到当前目录,即这一行

// 指定上传路径
ftp.changeWorkingDirectory(remotePath);

同时需要指定上传文件的类型

// 指定上传文件的类型 二进制文件
ftp.setFileType(FTP.BINARY_FILE_TYPE);

 

下载

/**
     * ftp下载文件
     * 
     * @param ip
     * @param port
     * @param userName
     * @param passWord
     * @param localPath
     * @param remotePath
     * @param fileContainsName
     *            文件包含名
     * @return
     * @throws Exception
     */
    public static String fileFtpDown(String ip, int port, String userName,
            String passWord, String localPath, String remotePath,
            String fileContainsName) throws Exception {
        FTPClient ftpClient = new FTPClient();// 创建客户端对象
        String fileName = "";
        SocketAddress address = new InetSocketAddress(ip, port);
        ftpClient.connect(ip, port);// 连接
        boolean login = ftpClient.login(userName, passWord);// 登陆
        if (login) {
            try {
                log.info("ftp服务器连接、登陆成功,地址为:" + address);
                ftpClient.enterLocalPassiveMode();// 开通一个端口来传输数据
                FTPFile[] fs = ftpClient.listFiles(remotePath);// fs为remoteFile下所有文件集合
                for (FTPFile ff : fs) {
                    String f = new String(ff.getName().getBytes("iso-8859-1"),
                            "utf-8");
                    if (f.contains(fileContainsName)) {// 文件名称不确定时用contains
                        File localFile = new File(localPath + "\\" + f); // 在本地指定路径创建了一个对象
                        OutputStream is = new FileOutputStream(localFile);
                        ftpClient.changeWorkingDirectory(remotePath);// 设置下载文件相对远程FTP根目录所处的路径
                        ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 开始下载文件前设置传输类型
                        ftpClient.retrieveFile(ff.getName(), is);
                        is.close();
                        fileName = f;
                    }
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ftpClient.isConnected()) {
                    try {
                        ftpClient.disconnect();
                    } catch (IOException ioe) {
                    }
                }
            }
        } else {
            log.info("ftp服务器连接、登陆失败");
        }
        return fileName;
    }

 

  

  

 

以上是关于Java中向ftp上传下载文件的主要内容,如果未能解决你的问题,请参考以下文章

java FTP下载文件在代码中如何实现知道下载完成?

Java上传文件FTP服务器代码

java在浏览器上获取FTP读文件路径

我的代码库-Java8实现FTP与SFTP文件上传下载

Java代码实现FTP单个文件下载

Java ftp 上传文件和下载文件