宝塔面板-FTP图片显示

 

前言

搭建

 

前言

公司部分产品使用宝塔面板运维,官网地址: https://www.bt.cn/ 突然想可以用来做FTP服务器,就随手搭了一个,然后前端展示图片

 

搭建

搭建非常简单,点击FTP 进行添加即可。我们的服务器属于内部服务器集群对外提供公网ip,所以需要映射。

1、添加完成后,进行本地测试,本地文件夹访问,跳转成功,输入账号密码,查看文件。

2、编写Java代码访问FTP,进行相关文件操作。这里遇到问题连接不上,启动被动模式解决。也有可能是FTP配置不对,需要在面板上进行设置。

3、我处于的环境是内网,所以得用公网IP去映射才能实现。

4、最后的结果是图片的展示,因为谷歌浏览器不支持图片的直接访问,并且也不安全,所以采用后台对文件进行BASE64处理,前端直接展示(虽然这样很傻,以前都是用的阿里云)

 

public class FtpUtils {
    //ftp服务器地址
    private static String hostname = "IP";
    //ftp服务器端口号默认为21
    private static Integer port = 21;
    //ftp登录账号
    private static String username = "";
  //ftp登录密码
    private static String password = "";

    private static FTPClient ftpClient = null;

    /**
     * 初始化ftp服务器
     */
//    @PostConstruct
    public void initFtpClient() {
        if (ftpClient == null) {
            ftpClient = new FTPClient();
            ftpClient.setControlEncoding("utf-8");
            try {
                System.out.println("connecting...ftp服务器:" + this.hostname + ":" + this.port);
                ftpClient.connect(hostname, port); //连接ftp服务器
                ftpClient.login(username, password); //登录ftp服务器
                int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
                if (!FTPReply.isPositiveCompletion(replyCode)) {
                    System.out.println("connect failed...ftp服务器:" + this.hostname + ":" + this.port);
                }
                System.out.println("connect successfu...ftp服务器:" + this.hostname + ":" + this.port);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 上传文件
     *
     * @param pathname       ftp服务保存地址
     * @param fileName       上传到ftp的文件名
     * @param originfilename 待上传文件的名称(绝对地址) *
     * @return
     */
    public boolean uploadFile(String pathname, String fileName, String originfilename) {
        boolean flag = false;
        InputStream inputStream = null;
        try {
            System.out.println("开始上传文件");
            inputStream = new FileInputStream(new File(originfilename));
            initFtpClient();
            ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
            CreateDirecroty(pathname);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.setControlEncoding("UTF-8");
            //其次有没有启动被动模式的:
            ftpClient.enterLocalPassiveMode();
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            flag = true;
            System.out.println("上传文件成功");
        } catch (Exception e) {
            System.out.println("上传文件失败");
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
    
    /**
 * 上传文件
 *
 * @param pathname    ftp服务保存地址
 * @param fileName    上传到ftp的文件名
 * @param inputStream 输入文件流
 * @return
 */
public boolean uploadFile(String pathname, String fileName, InputStream inputStream) {
    boolean flag = false;
    try {
        System.out.println("开始上传文件");
        initFtpClient();
        ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
        CreateDirecroty(pathname);
        ftpClient.makeDirectory(pathname);
        ftpClient.changeWorkingDirectory(pathname);
        ftpClient.storeFile(fileName, inputStream);
        inputStream.close();
        ftpClient.logout();
        flag = true;
        System.out.println("上传文件成功");
    } catch (Exception e) {
        System.out.println("上传文件失败");
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != inputStream) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return true;
}

//改变目录路径
public boolean changeWorkingDirectory(String directory) {
    boolean flag = true;
    try {
        flag = ftpClient.changeWorkingDirectory(directory);
        if (flag) {
            System.out.println("进入文件夹" + directory + " 成功!");

        } else {
            System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return flag;
}

//创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
public boolean CreateDirecroty(String remote) throws IOException {
    boolean success = true;
    String directory = remote + "/";
    // 如果远程目录不存在,则递归创建远程服务器目录
    if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {
        int start = 0;
        int end = 0;
        if (directory.startsWith("/")) {
            start = 1;
        } else {
            start = 0;
        }
        end = directory.indexOf("/", start);
        String path = "";
        String paths = "";
        while (true) {
            String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
            path = path + "/" + subDirectory;
            if (!existFile(path)) {
                if (makeDirectory(subDirectory)) {
                    changeWorkingDirectory(subDirectory);
                } else {
                    System.out.println("创建目录[" + subDirectory + "]失败");
                    changeWorkingDirectory(subDirectory);
                }
            } else {
                changeWorkingDirectory(subDirectory);
            }

            paths = paths + "/" + subDirectory;
            start = end + 1;
            end = directory.indexOf("/", start);
            // 检查所有目录是否创建完毕
            if (end <= start) {
                break;
            }
        }
    }
    return success;
}

//判断ftp服务器文件是否存在
public boolean existFile(String path) throws IOException {
    boolean flag = false;
    FTPFile[] ftpFileArr = ftpClient.listFiles(path);
    if (ftpFileArr.length > 0) {
        flag = true;
    }
    return flag;
}

//创建目录
public boolean makeDirectory(String dir) {
    boolean flag = true;
    try {
        flag = ftpClient.makeDirectory(dir);
        if (flag) {
            System.out.println("创建文件夹" + dir + " 成功!");

        } else {
            System.out.println("创建文件夹" + dir + " 失败!");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return flag;
}

/**
 * 下载文件 *
 *
 * @param pathname  FTP服务器文件目录 *
 * @param filename  文件名称 *
 * @param localpath 下载后的文件路径 *
 * @return
 */
public boolean downloadFile(String pathname, String filename, String localpath) {
    boolean flag = false;
    OutputStream os = null;
    try {
        System.out.println("开始下载文件");
        initFtpClient();
        //切换FTP目录
        ftpClient.changeWorkingDirectory(pathname);
        FTPFile[] ftpFiles = ftpClient.listFiles();
        for (FTPFile file : ftpFiles) {
            if (filename.equalsIgnoreCase(file.getName())) {
                File localFile = new File(localpath + "/" + file.getName());
                os = new FileOutputStream(localFile);
                ftpClient.retrieveFile(file.getName(), os);
                os.close();
            }
        }
        ftpClient.logout();
        flag = true;
        System.out.println("下载文件成功");
    } catch (Exception e) {
        System.out.println("下载文件失败");
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != os) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return flag;
 }
 public boolean getFileBase64(String pathname, String filename) {
    boolean flag = false;
    OutputStream os = null;
    try {
        System.out.println("开始下载文件");
        initFtpClient();
        //切换FTP目录
        ftpClient.changeWorkingDirectory(pathname);
        FTPFile[] ftpFiles = ftpClient.listFiles();
        for (FTPFile file : ftpFiles) {
            if (filename.equalsIgnoreCase(file.getName())) {
                InputStream fis = ftpClient.retrieveFileStream(file.getName());
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                String encode = new BASE64Encoder().encode(buffer);
               // 输出Base64编码
                System.out.println(encode);
            }
        }
        ftpClient.logout();
        flag = true;
        System.out.println("下载文件成功");
    } catch (Exception e) {
        System.out.println("下载文件失败");
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != os) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return flag;
}

/**
 * 删除文件 *
 *
 * @param pathname FTP服务器保存目录 *
 * @param filename 要删除的文件名称 *
 * @return
 */
public boolean deleteFile(String pathname, String filename) {
    boolean flag = false;
    try {
        System.out.println("开始删除文件");
        initFtpClient();
        //切换FTP目录
        ftpClient.changeWorkingDirectory(pathname);
        ftpClient.dele(filename);
        ftpClient.logout();
        flag = true;
        System.out.println("删除文件成功");
    } catch (Exception e) {
        System.out.println("删除文件失败");
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return flag;
}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值