`

基于Apache FTP实现的文件上传下载工具

阅读更多
基于Apache FTP实现文件上传下载工具 ,上传文件时需要考虑以下问题(实例未实现续传功能):

(1)、 FTP服务器是否存在改目录,如果不存在目录则需要创建目录。

(2)、判断上传文件是否已经存在,如果存在是需要删除后再上传还是续传。
package com.scengine.wtms.utils.ftp;  
  
import java.io.ByteArrayOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.io.PrintWriter;  
import java.net.SocketException;  
import java.net.URLEncoder;  
import javax.servlet.http.HttpServletResponse;  
import org.apache.commons.net.PrintCommandListener;  
import org.apache.commons.net.ftp.FTP;  
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.net.ftp.FTPClientConfig;  
import org.apache.commons.net.ftp.FTPFile;  
import org.apache.commons.net.ftp.FTPReply;  
  
import com.scengine.wtms.utils.Log;  
  
public class FTPUtils  
{  
  
    private FTPClient ftp;  
  
    /** 
     * 对象构造 设置将过程中使用到的命令输出到控制台 
     */  
    public FTPUtils()  
    {  
        ftp = new FTPClient();  
        this.ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));  
    }  
  
    /** 
     * 用户FTP账号登录 
     *  
     * @param url 
     *            FTP地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            用户名 
     * @param password 
     *            密 码 
     * @return true/false 成功/失败 
     * @throws SocketException 
     * @throws IOException 
     */  
    private boolean login(String url, int port, String username, String password) throws SocketException, IOException  
    {  
        int reply;  
        // 1. 连接FTP服务器  
        // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
        ftp.connect(url, port);  
  
        // 2. 设置编码  
        // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件  
        ftp.setControlEncoding("UTF-8");  
        FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
        conf.setServerLanguageCode("zh");  
  
        // 3. 登录ftp  
        ftp.login(username, password);  
  
        // 看返回的值是不是230,如果是,表示登陆成功  
        reply = ftp.getReplyCode();  
  
        // 以2开头的返回值就会为真  
        if (!FTPReply.isPositiveCompletion(reply))  
        {  
            ftp.disconnect();  
            Log.getLogger(this.getClass()).info(">>>>>>>>>>>>>>>>连接服务器失败!");  
            return false;  
        }  
        Log.getLogger(this.getClass()).info(">>>>>>>>>>>>>>>>>登陆服务器成功!");  
        return true;  
    }  
  
    /** 
     * 释放FTP 
     */  
    private void free()  
    {  
        if (ftp.isAvailable())  
        {  
            try  
            {  
                // 退出FTP  
                ftp.logout();  
            } catch (IOException e)  
            {  
                Log.getLogger(this.getClass()).error("FTP登录退出异常:" + e.getMessage());  
            }  
        }  
        if (ftp.isConnected())  
        {  
            try  
            {  
                // 断开连接  
                ftp.disconnect();  
            } catch (IOException e)  
            {  
                Log.getLogger(this.getClass()).error("FTP断开连接异常:" + e.getMessage());  
            }  
        }  
    }  
  
    /** 
     * FTP文件上传 
     *  
     * @param url 
     *            FTP地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            FTP用户名 
     * @param password 
     *            FTP密码 
     * @param localAdr 
     *            上传文件名 
     * @param remoteAdr 
     *            指定的FTP目录 
     * @return 
     * @throws IOException 
     */  
    public boolean uploadFile(String url, int port, String username, String password, String localAdr, String remoteAdr) throws IOException  
    {  
  
        // 初始表示上传失败  
        boolean success = false;  
        /******验证用户登录信息*****/  
        try  
        {  
            success = login(url, port, username, password);  
  
            Log.getLogger(this.getClass()).info("FTP用户登录:" + (success ? "成功!" : "失败!"));  
            if (!success)  
            {  
                return success;  
            }  
        } catch (IOException e)  
        {  
            Log.getLogger(this.getClass()).error("上传文件异常:" + e.getMessage());  
            return success;  
        }  
        // 设置PassiveMode传输  
        ftp.enterLocalPassiveMode();  
  
        // 设置FTP文件类型为二进制,如果缺省该句 传输txt正常 但图片和其他格式的文件传输出现乱码  
        ftp.setFileType(FTP.BINARY_FILE_TYPE);  
  
        /*****对远程目录的处理******/  
        String remoteFileName = remoteAdr;  
  
        if (remoteAdr.contains("/"))  
        {  
            remoteFileName = remoteAdr.substring(remoteAdr.lastIndexOf("/") + 1);  
            String directory = remoteAdr.substring(0, remoteAdr.lastIndexOf("/") + 1);  
  
            if (!directory.equalsIgnoreCase("/") && !ftp.changeWorkingDirectory(directory))  
            {  
  
                // 如果远程目录不存在,则递归创建远程服务器目录  
                int start = 0, end = 0;  
  
                if (directory.startsWith("/"))  
                {  
                    start = 1;  
                } else  
                {  
                    start = 0;  
                }  
  
                end = directory.indexOf("/", start);  
  
                while (true)  
                {  
  
                    String subDirectory = remoteAdr.substring(start, end);  
  
                    if (!ftp.changeWorkingDirectory(subDirectory))  
                    {  
  
                        if (ftp.makeDirectory(subDirectory))  
                        {  
  
                            ftp.changeWorkingDirectory(subDirectory);  
  
                        } else  
                        {  
                            Log.getLogger(this.getClass()).info("创建目录失败");  
                            return false;  
                        }  
                    }  
                    start = end + 1;  
                    end = directory.indexOf("/", start);  
                    // 检查所有目录是否创建完毕  
                    if (end <= start)  
                    {  
                        break;  
                    }  
                }  
            }  
        }  
  
        /*****执行文件上传******/  
        InputStream input = null;  
        try  
        {  
            File f = new File(localAdr);  
            // 得到目录的相应文件列表  
            FTPFile[] fs = ftp.listFiles(remoteFileName);  
  
            Log.getLogger(this.getClass()).info("上传文件个数:" + fs.length + "  ,文件名称:" + localAdr);  
  
            input = new FileInputStream(f);  
            // 保存文件remoteFileName  
            success = ftp.storeFile(remoteFileName, input);  
            input.close();  
        } catch (IOException e)  
        {  
            Log.getLogger(this.getClass()).info("上传文件失败:" + e.getMessage());  
            if (input != null)  
            {  
                input.close();  
            }  
        } finally  
        {  
            Log.getLogger(this.getClass()).info("保存标识>>>" + success + "文件名称:" + localAdr + (success ? "上传成功!" : "上传失败!"));  
            free();  
        }  
        return success;  
    }  
  
    /** 
     * 删除FTP文件 
     *  
     * @param url 
     *            FTP地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            用户名 
     * @param password 
     *            密 码 
     * @param remoteAdr 
     *            文件路径 
     * @param localAdr 
     *            文件名称 
     * @return true/false 成功/失败 
     */  
    public boolean deleteFile(String url, int port, String username, String password, String remoteAdr, String localAdr)  
    {  
  
        // localAdr:要上传的文件  
        // remoteAdr :上传的路径  
        // 初始表示上传失败  
        boolean success = false;  
  
        try  
        {  
            success = login(url, port, username, password);  
            Log.getLogger(this.getClass()).info("FTP用户登录:" + (success ? "成功!" : "失败!"));  
            if (!success)  
            {  
                return success;  
            }  
  
            //String codeclocalAdr = new String(localAdr.getBytes("UTF-8"), "ISO-8859-1");  
            //String remoteAdr_ = new String(remoteAdr.getBytes("UTF-8"), "ISO-8859-1");  
  
            // 转到指定上传目录  
            // remoteAdr_->remoteAdr  
            ftp.changeWorkingDirectory(remoteAdr);  
  
            FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表  
            if(fs.length>0)  
            {  
  
                // codeclocalAdr->localAdr  
                success = ftp.removeDirectory(remoteAdr);  
  
                ftp.logout();  
            }  
  
        } catch (IOException e)  
        {  
            Log.getLogger(this.getClass()).error(e.getMessage());  
        } finally  
        {  
            free();  
        }  
  
        return success;  
    }  
  
    /** 
     * 删除FTP文件和目录 
     *  
     * @param url 
     *            FTP地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            用户名 
     * @param password 
     *            密 码 
     * @param remoteAdr 
     *            文件路径 
     * @return true/false 成功/失败 
     */  
    public boolean deleteDir(String url, int port, String username, String password, String remoteAdr)  
    {  
  
        // localAdr:要上传的文件  
        // remoteAdr :上传的路径  
        // 初始表示上传失败  
        boolean success = false;  
  
        try  
        {  
            success = login(url, port, username, password);  
            Log.getLogger(this.getClass()).info("FTP用户登录:" + (success ? "成功!" : "失败!"));  
            if (!success)  
            {  
                return success;  
            }  
  
            //String codeclocalAdr = new String(localAdr.getBytes("UTF-8"), "ISO-8859-1");  
            //String remoteAdr_ = new String(remoteAdr.getBytes("UTF-8"), "ISO-8859-1");  
  
            // 转到指定上传目录  
            // remoteAdr_->remoteAdr  
            ftp.changeWorkingDirectory(remoteAdr);  
  
            FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表  
            if(fs.length>0)  
            {  
  
                // codeclocalAdr->localAdr  
                success = ftp.removeDirectory(remoteAdr);  
  
                ftp.logout();  
            }  
  
        } catch (IOException e)  
        {  
            Log.getLogger(this.getClass()).error(e.getMessage());  
        } finally  
        {  
            free();  
        }  
        return success;  
    }  
  
    /** 
     * 下载FTP文件 
     *  
     * @param url 
     *            FPT地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            用户名 
     * @param password 
     *            密 码 
     * @param remoteremoteAdr 
     *            远程路径 
     * @param localAdr 
     *            文件名称 
     * @param outputStream文件输出流 
     * @param response 
     *            Http响应 
     * @return true/false 成功/失败 
     */  
    public boolean downFile(String url, int port, String username, String password, String remoteremoteAdr, String localAdr, HttpServletResponse response)  
    {  
        boolean success = false;  
        try  
        {  
            success = login(url, port, username, password);  
            Log.getLogger(this.getClass()).info("FTP用户登录:" + (success ? "成功!" : "失败!"));  
            if (!success)  
            {  
                return success;  
            }  
            // 转移到FTP服务器目录  
            ftp.changeWorkingDirectory(remoteremoteAdr);  
            // 得到目录的相应文件列表  
            FTPFile[] fs = ftp.listFiles();  
              
            for (FTPFile ftpFile : fs)  
            {  
                if (ftpFile.getName().equals(localAdr))  
                {  
                    // 这个就就是弹出下载对话框的关键代码  
                    response.setHeader("Content-disposition", "attachment;localAdr=" + URLEncoder.encode(localAdr, "UTF-8"));  
                    // 将文件保存到输出流outputStream中  
                    File f=new File(localAdr);  
                    OutputStream os=new FileOutputStream(f);  
                    ftp.retrieveFile(new String(ftpFile.getName().getBytes("UTF-8"), "ISO-8859-1"), os);  
                    os.flush();  
                    os.close();  
                }  
            }  
            ftp.logout();  
            success = true;  
        } catch (IOException e)  
        {  
            e.printStackTrace();  
        } finally  
        {  
            free();  
        }  
        return success;  
    }  
  
    /** 
     * 读取FTP文件内容 
     *  
     * @param url 
     *            FPT地址 
     * @param port 
     *            FTP端口 
     * @param username 
     *            用户名 
     * @param password 
     *            密 码 
     * @param remoteremoteAdr 
     *            远程路径 
     * @param localAdr 
     *            文件名称 
     * @return String 文件内容 
     */  
    public String readFileContent(String url, int port, String username, String password, String remoteremoteAdr, String localAdr)  
    {  
        String content = null;  
        try  
        {  
            boolean success = login(url, port, username, password);  
            Log.getLogger(this.getClass()).info("FTP用户登录:" + (success ? "成功!" : "失败!"));  
            if (success)  
            {  
                // 转移到FTP服务器目录  
                ftp.changeWorkingDirectory(remoteremoteAdr);   
                  
                // 得到目录的相应文件列表  
                FTPFile[] fs = ftp.listFiles();  
                  
                for (FTPFile ftpFile : fs)  
                {  
                    if (ftpFile.getName().equals(localAdr))  
                    {  
                        // 这个就就是弹出下载对话框的关键代码  
                        // 将文件保存到输出流outputStream中  
                        File f=new File(localAdr);  
                        ftp.retrieveFile(new String(ftpFile.getName().getBytes("UTF-8"), "ISO-8859-1"), new FileOutputStream(f));  
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
                        ftp.retrieveFile(ftpFile.getName(), bos);  
                        bos.flush();  
                        bos.close();  
  
                        content = new String(bos.toByteArray(), "UTF-8");  
                    }  
                }  
            }  
        } catch (IOException e)  
        {  
            Log.getLogger(FTPUtils.class).error(e.getMessage());  
        } finally  
        {  
            free();  
        }  
        return content;  
    }  
  
    /** 
     * 判断是否重名的方法 
     *  
     * @param localAdr 
     *            文件名称 
     * @param fs 
     *            文件列表数组 
     * @return 
     */  
    public static boolean isDirExist(String localAdr, FTPFile[] fs)  
    {  
        for (FTPFile ftpFile : fs)  
        {  
            if (ftpFile.getName().equals(localAdr))  
            {  
                return true;  
            }  
        }  
        return false;  
    }  
  
    /** 
     * 根据重名判断的结果 生成新的文件的名称 更改的重名为 原有名字+[n], n表示数字 
     *  
     * @param localAdr 
     *            文件名称 
     * @param fs 
     *            FTP文件列表 
     * @return 
     */  
    public static String changeName(String localAdr, FTPFile[] fs)  
    {  
        int n = 0;  
        // 创建一个可变的字符串对象 即StringBuffer对象,把localAdr值付给该对象  
        StringBuffer localAdr_ = new StringBuffer("");  
        localAdr_ = localAdr_.append(localAdr);  
  
        // 重名时改名,遍历存在同名的文件  
        while (isDirExist(localAdr_.toString(), fs))  
        {  
            n++;  
            String a = "[" + n + "]";  
            // 最后一出现小数点的位置  
            int b = localAdr_.lastIndexOf(".");  
            // 最后一次"["出现的位置  
            int c = localAdr_.lastIndexOf("[");  
            if (c < 0)  
            {  
                c = b;  
            }  
  
            // 文件的名字  
            StringBuffer name = new StringBuffer(localAdr_.substring(0, c));  
            // 后缀的名称  
            StringBuffer suffix = new StringBuffer(localAdr_.substring(b + 1));  
            localAdr_ = name.append(a).append(".").append(suffix);  
        }  
        return localAdr_.toString();  
    }  
  
    public static void main(String[] args)  
    {  
        FTPUtils ftp = new FTPUtils();  
        try  
        {  
            ftp.uploadFile("192.168.1.200", 21, "duser", "HTPDuserXP32", "C:\\Users\\Administrator\\Desktop\\backgroud_change.html", "/htmls/backgroud_change.html");  
        } catch (IOException e)  
        {  
            Log.getLogger(FTPUtils.class).error(e.getMessage());  
        }  
    }  
  
}  
分享到:
评论

相关推荐

    java基于Apache FTP实现文件上传、下载、修改文件名、删除

    - 在示例代码中,定义了一个名为`FTPStatus`的枚举类型,用于表示各种FTP文件操作的状态,如文件存在、目录创建成功/失败、上传/下载成功/失败等。这样可以方便地跟踪和处理操作结果。 6. **FTP文件操作工具类**:...

    apache ftp工具所需jar

    Apache FTP工具所需JAR文件是Java开发中用于与FTP服务器交互的重要组件,这些JAR库提供了方便的API,使得开发者可以轻松地实现FTP文件传输功能。以下是对这些JAR文件的详细说明: 1. `ant-jakarta-oro-1.6.1.jar`: ...

    ApacheFTP开源工具

    Apache FTP开源工具是一款基于Java语言实现的FTP(File Transfer Protocol)客户端库,它为开发者提供了在Java应用程序中轻松实现FTP文件传输的能力。Apache FTP工具旨在简化FTP通信过程,避免开发者从头开始编写...

    JAVA实现简单的对FTP上传与下载

    本文将详细介绍如何使用Java实现简单的FTP文件上传与下载功能,并基于提供的"ftpLoadDown.jar"库和"使用方法.txt"来解析相关知识。 首先,我们需要了解FTP的基础知识。FTP是一种应用层协议,它依赖于TCP/IP协议栈,...

    apache ftp server

    Apache FTP Server是一个开源的FTP服务器,它允许用户通过FTP协议上传、下载文件。这个服务器是用Java语言编写的,因此可以在任何支持Java的平台上运行,包括Windows、Linux、Unix等操作系统。Apache FTP Server的...

    java写的FTP上传下载工具(支持多用户)

    Java编写的FTP上传下载工具是一种基于Java语言实现的文件传输应用程序,主要功能是与FTP(File Transfer Protocol)服务器进行交互,实现文件的上传和下载。这个工具特别之处在于它支持多用户登录,这意味着不同的...

    apache ftpserver讲解

    Apache FTP Server 是一个基于 Java 的开源 FTP 服务器,它提供了丰富的功能和灵活性,能够满足各种文件传输需求。在 CMMB 中广传媒项目中,为了实现更为安全和灵活的文件传输,采用了 Apache FTP Server,并将其与...

    Apache Ftp Server使用说明

    Apache Ftp Server是一款开源的FTP服务器软件,基于Java平台,由Apache软件基金会开发。它提供了高度可配置性和灵活性,使得用户可以根据自身需求定制FTP服务。本文将深入探讨Apache Ftp Server的使用方法,包括安装...

    apache_ftp 开发包

    Apache FTP开发包是一个用于构建FTP(文件传输协议)客户端和服务端应用的软件包,主要基于Apache Commons Net库。这个开发包包含了多个相关的组件和库,为开发者提供了在Java环境中实现FTP功能的强大支持。 Apache...

    java版ftp上传下载工具类

    Java FTP上传下载工具类是基于Apache的Commons Net库实现的,这个库为Java开发者提供了FTP(文件传输协议)客户端功能。Apache Commons Net是Apache软件基金会的一个项目,它提供了多种Internet协议的Java实现,包括...

    java实现ftp自动上传文件

    在Java编程环境中,FTP(File Transfer Protocol)是一种常用的文件传输...这个项目展示了如何在Java中集成多种技术来实现一个实用的FTP文件上传工具,对于提升Java开发者在系统集成和自动化操作方面的技能有很大帮助。

    ftp上传工具, 上传ftp服务器

    在这个场景中,我们关注的是一个基于Java开发的FTP上传工具,它能够帮助用户将本地文件上传到FTP服务器。以下是一些关于FTP上传工具和相关技术的知识点: 1. **FTP基本概念**: FTP是一个应用层协议,基于TCP/IP...

    FTP的上传和下载实现

    ### FTP的上传与下载实现详解 #### 一、引言 在互联网技术中,FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议和服务。它主要用于实现计算机之间的文件传输功能,尤其是在不同操作系统...

    基于ftp服务器,csv文件转换格式的文件上传下载实例

    在这个基于FTP服务器的CSV文件转换格式的文件上传下载实例中,我们将探讨如何利用FTP(File Transfer Protocol)服务进行文件的交互,以及如何处理CSV(Comma Separated Values)文件格式转换。FTP是一种标准网络...

    利用commons-net包实现ftp上传下载例子

    标题中的“利用commons-net包实现ftp上传下载例子”是指通过Apache Commons Net库来实现FTP(File Transfer Protocol)的上传和下载功能。Apache Commons Net是Apache软件基金会开发的一个Java库,它提供了多种网络...

    ApacheCamel-FTP

    总的来说,Apache Camel FTP 组件是构建基于文件传输的集成解决方案的强大工具,通过其丰富的功能和易于使用的 API,能够简化开发工作,提升系统的可维护性和扩展性。结合提供的示例,你可以深入学习并掌握如何在...

    ftp上传下载包.zip

    总结来说,"ftp上传下载包.zip"提供了一套完整的FTP文件传输解决方案,包括源代码和必要的依赖库。开发者可以通过学习和使用这些资源,快速地在他们的应用程序中实现FTP上传和下载功能,无论是为了传输用户生成的...

    FTP上传测试工具 java

    在这个场景中,"FTP上传测试工具 java" 提供了一种基于Java语言的解决方案,用于测试FTP功能和验证与客户的FTP通信需求。Java作为一种通用且跨平台的编程语言,提供了丰富的库和API来实现FTP客户端功能。 首先,...

    FTP上传下载,批量上传下载

    为了实现FTP上传和下载,你需要一个FTP客户端,它可以是命令行工具如`ftp`,也可以是图形用户界面的软件如FileZilla。FTP客户端需要知道服务器的地址(IP或域名)、端口号(默认为21)、用户名和密码。配置完成后,...

    基于springboot的FtpUtil工具类.zip

    总的来说,基于SpringBoot的FtpUtil工具类为我们提供了一种便捷的方式,通过简单的调用即可实现FTP文件操作,大大简化了开发流程。配合提供的项目源码和说明,无论是初学者还是经验丰富的开发者,都能从中受益,提高...

Global site tag (gtag.js) - Google Analytics