java 搭建ftp文件服务器 编写 增 删 改 查 下载 工具类

搭建看这个文章
传送阵

添加 maven

          <!--ftp 工具-->
            <dependency>
                <groupId>commons-net</groupId>
                <artifactId>commons-net</artifactId>
                <version>3.6</version>
            </dependency>

**连接信息我写在配置文件了,根据自己的情况写 **

ftp:
  port: 21
  ip: 192.168.100.10
  username: Administrat
  password: 1qazwsx-

增 删 改 查 下载 工具类


import com.ruoyi.common.core.constant.Constants;
import org.apache.commons.net.ftp.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;


@Component
public class FtpUtils {

    @Value("${ftp.ip}")
    private String ip;
    @Value("${ftp.port}")
    private String port;
    @Value("${ftp.username}")
    private String username;
    @Value("${ftp.password}")
    private String password;

    /**
     * 连接 ftp
     *
     * @return
     */
    public FTPClient initFtpClient() {
        Integer reply;
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(ip, Integer.parseInt(port));            //连接Ftp服务器
            ftpClient.login(username, password);  //登陆Ftp服务器
            ftpClient.setControlEncoding("utf-8");//设置编码类型
            reply = ftpClient.getReplyCode();     //获取返回码,用于判断是否连接成功
            if (!FTPReply.isPositiveCompletion(reply)) {
                System.err.println("服务器连接失败");
                return null;
            } else {
                ftpClient.enterLocalPassiveMode();  //设置被动模式
                ftpClient.setControlEncoding("utf-8");//设置字符模式,解决中文乱码问题
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally {
            dropFtpClient(ftpClient);
        }
        return ftpClient;
    }


    /**
     * 关闭
     */
    public void dropFtpClient(FTPClient ftpClient) {
        try {
            ftpClient.logout();     //退出登陆
            if (ftpClient.isConnected()) {//检测是否连接Ftp服务器
                ftpClient.disconnect(); //关闭连接
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文件
     *
     * @param pathname    ftp服务保存地址
     * @param inputStream 待上传文件的名称(绝对地址) *
     * @return
     */
    public boolean uploadFiles(FTPClient ftpClient, String pathname, InputStream inputStream, String fileName) {
        boolean is_success = false;
        try {
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            String pathname_new = new String(pathname.getBytes("GBK"), "iso-8859-1");
            createDirs(ftpClient, pathname_new);
            ftpClient.changeWorkingDirectory(pathname_new); //跳转到指定的Ftp文件目录(相对路径)
            String localFileName = new String(fileName.getBytes("GBK"), "iso-8859-1");
            is_success = ftpClient.storeFile(localFileName, inputStream);//上传文件
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            dropFtpClient(ftpClient);
        }
        return is_success;
    }

    /**
     * 上传文件
     * @param pathname       ftp服务保存地址
     * @param originfilename 待上传文件的名称(绝对地址) *
     * @return
     */
    public boolean uploadFiles(FTPClient ftpClient, String pathname, String originfilename) {
        boolean is_success = false;
        InputStream inputStream = null;
        try {
            File localFile = new File(originfilename);
            inputStream = new FileInputStream(localFile);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            String pathname_new = new String(pathname.getBytes("GBK"), "iso-8859-1");
            createDirs(ftpClient, pathname_new);
            ftpClient.changeWorkingDirectory(pathname_new); //跳转到指定的Ftp文件目录(相对路径)
            String localFileName = new String(localFile.getName().getBytes("GBK"), "iso-8859-1");
            is_success = ftpClient.storeFile(localFileName, inputStream);//上传文件
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            dropFtpClient(ftpClient);
        }
        return is_success;
    }

    /**
     * 下载文件
     *
     * @param pathName  ftp服务器文件目录
     * @param localPath 下载后的文件路径 *
     * @return
     */
    public static boolean downloadFile(FTPClient ftpClient, String pathName, String localPath) {
        boolean is_success = false;
        OutputStream os = null;
        try {
            ftpClient.changeWorkingDirectory(pathName);//跳转到指定的Ftp文件目录
            FTPFile[] ftpFiles = ftpClient.listFiles();//获取目录下所有的文件和文件夹
            //遍历目录下所有的文件
            for (FTPFile file : ftpFiles) {
                if (file.isFile()) {
                    File localFile = new File(localPath + "/" + file.getName());
                    os = new FileOutputStream(localFile);

                    ftpClient.retrieveFile(file.getName(), os);//下载文件到本地
                    os.close();
                } else if (file.isDirectory()) {
                    downloadFile(ftpClient, pathName + file.getName() + "/", localPath);
                }
            }
            is_success = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return is_success;
    }

    /**
     * 功能:根据文件名称,下载文件流
     *
     * @param filename 地址与文件名
     * @return
     * @throws IOException
     */
    public void download(String filename, HttpServletResponse response) {
        // 获取文件名称
        String[] strs = filename.split("/");
        String downloadFile = strs[strs.length - 1];

        try {
            // 设置文件ContentType类型,这样设置,会自动判断下载文件类型
            response.setContentType("application/x-msdownload");
            // 设置文件头:最后一个参数是设置下载的文件名并编码为UTF-8
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8"));
            // 建立连接
            FTPClient ftpClient = initFtpClient();
            // 此句代码适用Linux的FTP服务器
            String newPath = new String(filename.getBytes("GBK"), "ISO-8859-1");
            // ftp文件获取文件
            InputStream is = null;
            BufferedInputStream bis = null;
            try {
                is = ftpClient.retrieveFileStream(newPath);
                bis = new BufferedInputStream(is);
                OutputStream out = response.getOutputStream();
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = bis.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                out.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                dropFtpClient(ftpClient);
                close(bis);
                close(is);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关流的
     *
     * @param closeable
     */
    public void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 删除文件
     *
     * @param pathName ftp服务器文件目录
     * @param fileName 删除的文件名
     * @param type     0:表示文件夹,1:标识文件
     * @return
     */
    public boolean deleteFile(FTPClient ftpClient, String pathName, String fileName, String type) {
        boolean is_success = false;
        try {
            String pathNmae_new = new String(pathName.getBytes("GBK"), "iso-8859-1");
            String fileName_new = new String(fileName.getBytes("GBK"), "iso-8859-1");
            ftpClient.changeWorkingDirectory(pathNmae_new);
            if (Constants.ZERO.equals(type)) {
                /*删除文件夹*/
                is_success = ftpClient.removeDirectory(fileName_new);
            } else {
                //删除文件
                is_success = ftpClient.deleteFile(fileName_new);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            dropFtpClient(ftpClient);
        }
        return is_success;
    }


    /**
     * 创建多级目录
     *
     * @param ftp  一个连接有效的ftp连接
     * @param path 可能需要创建的多级目录路径,/分隔
     */
    public void createDirs(FTPClient ftp, String path) {
        /*该部分为逐级创建*/
        String[] split = path.split("/");
        try {
            for (String str : split) {
                if (StringUtils.isBlank(str)) {
                    continue;
                }
                if (!ftp.changeWorkingDirectory(str)) {
                    ftp.makeDirectory(str);
                    ftp.changeWorkingDirectory(str);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值