FTPUtils

本文介绍了一个基于Java的FTP工具类的设计与实现过程,包括如何使用commons-net和thumbnailator库进行文件上传、下载、目录操作以及图片压缩处理。详细展示了如何连接FTP服务器,执行文件上传,并对上传的图片进行自动压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


引入jar包:
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>2.2</version>
</dependency>

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>
工具类:
package com.zr.utils.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

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

import net.coobird.thumbnailator.Thumbnails;

public class FTPUtils {
    private static FTPUtils instance = null;
    private static FTPClient ftpClient = null;
    private String cache_dir = "e:/cache/";//用于压缩图片
    private String server = "192.168.1.13";
    private int port = 21;
    private String userName = "ZW-13";
    private String userPassword = "123";

    public static FTPUtils getInstance(){
        if(instance == null){
            instance = new FTPUtils();
        }

        ftpClient = new FTPClient();
        return instance;
    }

    /**
     * 连接FTP服务器
     * @return
     */
    private boolean connect(){
        boolean stat = false;
        try {
            if(ftpClient.isConnected())
                return true;
            ftpClient.connect(server, port);
            stat = true;
        } catch (SocketException e) {
            stat = false;
            e.printStackTrace();
        } catch (IOException e) {
            stat = false;
            e.printStackTrace();
        }
        return stat;
    }

    /**
     * 打开FTP服务器
     * @return
     */
    public boolean open(){
        if(!connect()){
            return false;
        }

        boolean stat = false;
        try {
            stat = ftpClient.login(userName, userPassword);
            // 检测连接是否成功
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                close();
                stat = false;
            }
        } catch (IOException e) {
            stat = false;
        }
        return stat;
    }


    /**
     * 关闭FTP服务器
     */
    public void close(){
        try {
            if(ftpClient != null){
                if(ftpClient.isConnected()){
                    ftpClient.logout();
                    ftpClient.disconnect();
                }

                ftpClient = null;
            }
        } catch (IOException e) {
        }
    }


    /**
     * 上传文件到FTP服务器
     * @param filename
     * @param path
     * @param input
     * @return
     */
    public boolean upload(String filename,String path,InputStream input){
        boolean stat = false;
        try {
            cd(path);
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            stat = ftpClient.storeFile(filename, input);
            input.close();  //关闭输入流
        } catch (IOException e) {

        }
        return stat;
    }

    /**
     * 上传文件到FTP服务器
     * @param filename
     * @param path
     * @param input
     * @return
     */
    public boolean upload(String filename,String path,String filepath){
        boolean stat = false;
        try {
            cd(path);
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileInputStream input = new FileInputStream(new File(filepath));
            stat = ftpClient.storeFile(filename, input);
            input.close();  //关闭输入流
        } catch (IOException e) {

        }
        return stat;
    }

    /**
     * 上传文件
     * @param filename
     * @param path
     * @param file
     * @return
     */
    public boolean upload(String filename,String path,File file){
        boolean stat = false;
        try {
            cd(path);
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileInputStream input = new FileInputStream(file);
            stat = ftpClient.storeFile(filename,input);
            input.close();  //关闭输入流
        } catch (IOException e) {

        }
        return stat;
    }

    /**
     * 上传图片自动压缩处理
     * @param path
     * @param filename
     * @param input
     * @param quality
     * @param maxWidth
     * @param maxHeight
     * @return
     */
    public boolean uploadImage(String path,String filename,InputStream input,float quality,int maxWidth,int maxHeight){
        boolean stat = false;
        try {
            String suffex = filename.substring(filename.lastIndexOf(".")+1, filename.length());
            System.out.println(suffex);
            File imagePath = new File(cache_dir + filename);
            Thumbnails.of(input).outputQuality(quality).size(maxWidth,maxHeight).toFile(imagePath);
            input.close();

            if(!imagePath.exists()){
                return false;
            }

            cd(path);
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileInputStream input2 = new FileInputStream(imagePath);
            stat = ftpClient.storeFile(filename,input2);
            input2.close();//关闭输入流
            imagePath.delete();
            stat = true;
        } catch (IOException e) {
            e.printStackTrace();
            stat = false;
        }
        return stat;
    }


    /**
     * 循环切换目录
     * @param dir
     * @return
     */
    public boolean cd(String dir){
        boolean stat = true;
        try {
            String[] dirs = dir.split("/");
            if(dirs.length == 0){
                return ftpClient.changeWorkingDirectory(dir);
            }

            stat = ftpClient.changeToParentDirectory();
            for(String dirss : dirs){
                stat = stat && ftpClient.changeWorkingDirectory(dirss);
            }

            stat = true;
        } catch (IOException e) {
            stat = false;
        }
        return stat;
    }

    /***
     * 创建目录
     * @param dir
     * @return
     */
    public boolean mkdir(String dir){
        boolean stat = false;
        try {
            ftpClient.changeToParentDirectory();
            ftpClient.makeDirectory(dir);
            stat = true;
        } catch (IOException e) {
            stat = false;
        }
        return stat;
    }

    /***
     * 创建多个层级目录
     * @param dir dong/zzz/ddd/ewv
     * @return
     */
    public boolean mkdirs(String dir){
        String[] dirs = dir.split("/");
        if(dirs.length == 0){
            return false;
        }
        boolean stat = false;
        try {
            ftpClient.changeToParentDirectory();
            for(String dirss : dirs){
                ftpClient.makeDirectory(dirss);
                ftpClient.changeWorkingDirectory(dirss);
            }

            ftpClient.changeToParentDirectory();
            stat = true;
        } catch (IOException e) {
            stat = false;
        }
        return stat;
    }

    /**
     * 删除文件夹
     * @param pathname
     * @return
     */
    public boolean rmdir(String pathname){
        try{
            return ftpClient.removeDirectory(pathname);
        }catch(Exception e){
            return false;
        }
    }

    /**
     * 删除文件
     * @param pathname
     * @return
     */
    public boolean remove(String pathname){
        boolean stat = false;
        try{
            stat = ftpClient.deleteFile(pathname);
        }catch(Exception e){
            stat = false;
        }
        return stat;
    }

    /**
     * 移动文件或文件夹
     * @param pathname1
     * @param pathname2
     * @return
     */
    public boolean rename(String pathname1,String pathname2){
        try {
            return ftpClient.rename(pathname1, pathname2);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值