从本地上传文件到FTP

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.testng.annotations.Test;

/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 * 
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class TestFtpClient {

    /**
     * 
     * 上传文件到FTP <br>
     * 〈功能详细描述〉
      * 
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    @Test
    public void testUploadFileToFtp() throws Exception {
        // 获取本地文件对应的输入流
        InputStream inputStream = new FileInputStream(new File(
                "D:/software/数据库学习资料/03-业务培训(第三阶段)/业务练习/满意度统计报表/相关脚本.sql"));

        // 连接到Ftp
        FTPClient ftpClient = FtpClientUtils.connectFtp("10.87.14.51", 21, "test", "test");
        // 上传文件到FTP
        FtpClientUtils.uploadFileByInputStream("luxiaofeng/b", new String("相关脚本.sql".getBytes("GBK"), "ISO-8859-1"),
                inputStream, ftpClient);

        // 关闭连接
        ftpClient.disconnect();
        // 关闭输入流
        inputStream.close();

    }
}




import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import com.suning.ids.client.util.StringUtils;

/**
 * FTP操作的工具类<br>
 * 〈功能详细描述〉
 * 
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class FtpClientUtils {

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉
     * 
     * @param directory
     * @param ftpClient
     * @return
     * @throws IOException
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static boolean createDirecroty(String directory, FTPClient ftpClient) throws Exception {
        // 首先判断目录是否存在
        if (ftpClient.changeWorkingDirectory(directory)) {
            return true;
        }

        String[] dirs = directory.split("/");
        for (String dir : dirs) {
            if (StringUtils.isNotEmpty(dir)) {
                // 如果目录不存在,则创建该目录
                if (!ftpClient.changeWorkingDirectory(dir)) {
                    if (ftpClient.makeDirectory(dir)) {
                        ftpClient.changeWorkingDirectory(dir);
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    /**
     * 
     * 连接到FTP <br>
     * 〈功能详细描述〉
     * 
     * @param host
     * @param port
     * @param username
     * @param password
     * @throws Exception
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static FTPClient connectFtp(String host, int port, String username, String password) throws Exception {
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(host, port);
        ftpClient.login(username, password);

        // 每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据,防止端口没有开启出现阻塞
        ftpClient.enterLocalPassiveMode();
        // 设置文件传输为二进制传输,默认为ASCII,二进制传输不会对文件内容作任何处理
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        return ftpClient;
    }

    /**
     * 
     * 上传文件到FTP通过输入流的方式 <br>
     * 〈功能详细描述〉
     * 
     * @param ftpClient
     * @param savePath
     * @param fileName
     * @param inputStream
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static void uploadFileByInputStream(String savePath, String fileName, InputStream inputStream,
            FTPClient ftpClient) throws Exception {
        // 创建上传的目录,存在则切换到该目录,不存在则创建该目录
        if (createDirecroty(savePath, ftpClient)) {
            ftpClient.storeFile(fileName, inputStream);
        }
    }

     /**
     * 
     * 从FTP下载文件到本地 <br>
     * 〈功能详细描述〉
     * 
     * @param remoteDir:远程文件目录
     * @param remteFileName:远程文件名
     * @param localFile:本地文件路径
     * @param ftpClient:FTPClient
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static void downloadFtpFile2Local(String remoteDir, String remteFileName, String localFile,
            FTPClient ftpClient) {
        FileOutputStream fos = null;
        // 首先判断远程文件目录是否存在
        try {
            if (ftpClient.changeWorkingDirectory(remoteDir)) {
                fos = new FileOutputStream(localFile);

                // 如果当前的文件类型(ftpClient.setFileType)是ASCII,行分隔符将转化为本地的格式
                ftpClient.retrieveFile(new String(remteFileName.getBytes("GBK"), "ISO-8859-1"), fos);
            }
        } catch (Exception e) {
            //日志
        } finally {
            // 关闭FTP连接
            if (ftpClient != null) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    //日志
                }
            }

            // 关闭输出流
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    //日志
                }
            }
        }

    }

}

你可能感兴趣的:(上传文件)