淘先锋技术网

首页 1 2 3 4 5 6 7

ftp服务器的作用

ftp服务器是用来上传文件或者删除文件用的,一般搭建图片服务器都需要使用它

windows搭建ftp服务器(配套tomcat完成图片服务器的搭建)

搭建

  1. 打开控制面板,选择程序,启用或关闭windows功能
    在这里插入图片描述

  2. 将ftp服务器和web管理工具全部勾选
    在这里插入图片描述

  3. 在tomcat服务下建一个文件夹用于存放ftp上传的图片
    在这里插入图片描述

  4. 到计算机管理界面点击Internet信息服务
    在这里插入图片描述

  5. 右键添加ftp站点
    在这里插入图片描述

  6. 设置站点信息,选择ftp文件夹,名称自定义
    在这里插入图片描述

  7. 绑定IP和设置SSL证书,没有证书就按照下图来
    在这里插入图片描述

  8. 设置身份校验和授权,匿名就是访问ftp不需要登录,基本就需要登录,账户密码为当前创建ftp服务的windows用户密码
    在这里插入图片描述

访问

  1. 打开本地系统资源,输入ftp://ip
    在这里插入图片描述
  2. 可以复制本地文件到资源中上传,打开tomcat服务并访问图片即可

linux搭建ftp服务器(配套tomcat完成图片服务器的搭建)

#1. 查看当前服务器是否安装了vsftpd
[root@Centos100 ~]# which vsftpd
#2. 安装vsftpd,安装完成后在/etc下面会有一个vsftpd目录
[root@Centos100 ~]# yum -y install vsftpd
#3. 到 /etc/vsftpd/目录下修改vsftpd.conf
[root@Centos100 ~]# vi /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
local_root=/software/tomcat/apache-tomcat-9.0.41/webapps/pic	#设置ftp访问目录,注意目录必须设置权限为755以上
allow_writeable_chroot=YES
chroot_local_user=YES
#4. 去掉文件ftpusers和user_list里面的root,使用户可以通过root连接ftp上传文件
#5. 关闭防火墙,启动ftp服务
[root@Centos100 ~]# service firewalld stop
[root@Centos100 ~]# service vsftpd start
#6. 在本地windows文件系统上测试一下查看,上传,下载,删除,重命名,如果不行,再试一下修改下面的配置
#方法一(需要重启服务器)
[root@Centos100 ~]# vi /etc/selinux/config
SELINUX=disabled	#将SELINUX设置为disabled,然后重启服务器,输入以下名令查询状态
[root@Centos100 ~]# getenforce
Disabled	#确认是该状态后再关闭防火墙启动ftp服务
#方法二(当前会话有效,需要配合方法一,以防服务器重启后无效,可以避免重启)
[root@Centos101 ~]# setenforce 0

注: 匿名访问模式,我试了好几次都失败了,如果有人配置成功,请在下方留言与我分享,谢谢!

使用javaAPI操作ftp完成上传下载删除

依赖

<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

ftp工具类

import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class FtpUtil {
   
	/**
	 * 获取ftp客户端连接
	 * @param ftpHost
	 * @param ftpUserName
	 * @param ftpPassword
	 * @param ftpPort
	 * @return
	 */
    private static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
        FTPClient ftpClient = null;
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(ftpHost, ftpPort);
            if(Utils.isNotEmpty(ftpUserName)) {
            	ftpClient.login(ftpUserName, ftpPassword);
            }else {
            	ftpClient.login("anonymous", null);
            }
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                System.out.println("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                System.out.println("FTP连接成功。");
            }
            //这个在对接linux服务器的时候必须要加,不加上传不上去
            ftpClient.enterLocalPassiveMode();
        } catch (SocketException e) {
            e.printStackTrace();
            System.out.println("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }
    
    /**
     * 删除ftp上的文件
     * @param ftpHost ftp主机
     * @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
     * @param ftpPassword 密码
     * @param ftpPort 端口
     * @param ftpPath ftp路径
     * @param fileName 删除的文件名称
     */
    public static void deleteFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName) {
        // 登录
    	FTPClient ftpClient = null;
	    try {
	        ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
	        ftpClient.setControlEncoding("UTF-8"); // 中文支持
	        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
	        ftpClient.enterLocalPassiveMode();
	        ftpClient.changeWorkingDirectory(ftpPath);
	        ftpClient.deleteFile(fileName);
	        ftpClient.logout();
	    } catch (FileNotFoundException e) {
	        System.out.println("没有找到" + ftpPath + "文件");
	        e.printStackTrace();
	    } catch (SocketException e) {
	        System.out.println("连接FTP失败.");
	        e.printStackTrace();
	    } catch (IOException e) {
	        System.out.println("文件读取错误。");
	        e.printStackTrace();
	    }
    }

	/**
	 * 下载文件(web应用一般用不到,客户端应用会用到)
	 * @param ftpHost ftp主机
	 * @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
	 * @param ftpPassword 密码
	 * @param ftpPort 端口
	 * @param ftpPath ftp路径
	 * @param localPath 下载本地路径
	 * @param fileName 需要下载的文件名称
	 */
	public static void downloadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName) {
	
	    FTPClient ftpClient = null;
	
	    try {
	        ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
	        ftpClient.setControlEncoding("UTF-8"); // 中文支持
	        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
	        ftpClient.enterLocalPassiveMode();
	        ftpClient.changeWorkingDirectory(ftpPath);
	
	        File localFile = new File(localPath + File.separatorChar + fileName);
	        OutputStream os = new FileOutputStream(localFile);
	        ftpClient.retrieveFile(fileName, os);
	        os.close();
	        ftpClient.logout();
	
	    } catch (FileNotFoundException e) {
	        System.out.println("没有找到" + ftpPath + "文件");
	        e.printStackTrace();
	    } catch (SocketException e) {
	        System.out.println("连接FTP失败.");
	        e.printStackTrace();
	    } catch (IOException e) {
	        System.out.println("文件读取错误。");
	        e.printStackTrace();
	    }
	}

	/**
	 * 上传文件
	 * @param ftpHost ftp主机
	 * @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
	 * @param ftpPassword 密码
	 * @param ftpPort 端口
	 * @param ftpPath ftp路径
	 * @param fileName 上传的文件名称
	 * @param input 上传的文件流
	 */
	public static void uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName,InputStream input){
	    FTPClient ftp = null;
	    try {
	        ftp = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
	        boolean makeDirectory = ftp.makeDirectory(ftpPath);
	        boolean changeWorkingDirectory = ftp.changeWorkingDirectory(ftpPath);
	        boolean setFileType = ftp.setFileType(FTP.BINARY_FILE_TYPE);
	        boolean storeFile = ftp.storeFile(fileName, input);
	        System.out.println(Boolean.toString(makeDirectory) + Boolean.toString(changeWorkingDirectory) + Boolean.toString(setFileType) + Boolean.toString(storeFile));
	        input.close();
	        ftp.logout();
	        System.out.println("upload succes!");
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	}
}