【Linux(CentOS7)下应用的安装部署】:九、搭建ftp服务

1.安装  ftp

[root@alves ~]# yum -y install vsftpd

2.  设置用户账号(添加的是 linux的系统用户但不能系统登录 ps:ftp/ftpuser等等会被当作匿名帐号)

#创建用于登陆的FTP的账号

[root@alves ~]# useradd username -s /sbin/nologin -U

#修改myftp密码

[root@alves ~]# passwd username

3. 修改vsftpd的主要配置文件

修改/etc/vsftpd/vsftpd.conf 文件,确认以下内容是否一致:

# 如不允许匿名访问则设置为NO
anonymous_enable=NO
##允许匿名用户上传等写入操作
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
#anon_root=/var/www/html

##允许用帐号密码方式登陆,是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许
local_enable=YES
#允许文件的写入操作
write_enable=YES
#连接的超时时间设定
idle_session_timeout=600
data_connection_timeout=120
##所有登陆的用户都作为nobody身份,更安全。
nopriv_user=nobody
local_umask=022
dirmessage_enable=YES
# Activate logging of uploads/downloads.
xferlog_enable=YES
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES
#
# You may fully customise the login banner string:
ftpd_banner=Welcome to blah FTP service.
# chroot)
chroot_local_user=YES
# the presence of the "-R" option, so there is a strong case for enabling it.
ls_recurse_enable=YES
listen=NO

pam_service_name=vsftpd
userlist_enable=NO
tcp_wrappers=YES

#以下内容默认是没有,添加进vsftpd.conf 文件的最后
#
##使用被动模式连接
pasv_enable=YES
##被动模式超时时间
accept_timeout=60
##被动模式所使用的端口范围
pasv_min_port=65400
pasv_max_port=65410
##启动并指定开放的用户列表
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
##监听的端口
listen_port=110
listen=YES
##开放用户账号登陆
guest_enable=YES
guest_username=ftp
##限制用户的上传下载速度,0为不限制,单位: bytes/秒
local_max_rate=0
##限制登陆用户的到默认的位置,默认YES为/var/ftp文件夹(没法创建文件夹)
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
##进入文件夹后提示的欢迎内容,如果没有/etc/vsftpd/welcome.txt这个文件就自己新建一个,随便写点东西进去。
dirmessage_enable=YES
banner_file=/etc/vsftpd/welcome.txt
##使用pam托管的账号
pam_service_name=vsftpd
#ftp用户的工作目录
local_root=/xxxx/xxx
allow_writeable_chroot=YES

 

4.创建必须的文件

检查下/etc/vsftpd/目录里是否有以下3个文件,如果没有就建个空的。

chroot_list 这个一般是没有的,建个空的吧

user_list 这个一般默认就存在,里面存放允许登陆的账号,一行一个账号名,如果不想让某个账号登陆ftp,那么这里就别填那个账号进来。

ftpusers 这个一般默认就存在,里面存放禁止登陆的账号,一行一个账号名。

PS:user_list和ftpusers功能差不多的,可以只用user_list 这个来管理,把 ftpusers 里面内容都删掉。

5.允许第一步创建的账号名myftp登陆。

在/etc/vsftpd/user_list 添加一行内容是myftp

查验一下/etc/vsftpd/ftpusers是否有myftp,如果有,就要删掉,不然就被禁止登陆了。

6.创建用于ftp的文件夹

mkdir -p /var/ftp

7.创建允许ftp用户操作的文件夹

mkdir -p /var/ftp/share

chmod 777 /var/ftp/share(ps:在ftp的工作目录里,如果是管理员mkdir创建的子目录 也需要修改权限)

8.防火墙开放相关的端口,并重启防火墙,输入以下指令,一行一行运行:

firewall-cmd --permanent --zone=public --add-port=21/tcp --permanent

firewall-cmd --permanent --zone=public --add-port=65400-65410/tcp --permanent

systemctl restart firewalld.service

#可以通过以下指定查看端口是否已添加进去

firewall-cmd --zone=public --list-ports

9.selinux开放相关权限,并重启selinux:

setsebool -P ftpd_full_access 1

setenforce 0

setenforce 1

#可以通过以下指令查看ftpd_full_access 是否为ON状态

getsebool -a|grep ftpd_full_access

10.启动ftp服务

systemctl restart vsftpd.service

#如果想开机启动ftp还要运行以下指令:

systemctl enable vsftpd.service


服务端后台代码

pom.xml:

 <!-- 加入ftp上传文件组件 -->
        <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>

Controller:



import com.alibaba.fastjson.JSONObject;
import org.alves.dataanalyze.config.Constants;
import org.alves.dataanalyze.pojo.weidong.SysUser;
import org.alves.dataanalyze.utils.kaiqiang.RequestStatusCode;
import org.alves.dataanalyze.utils.weidong.AlvesJSONResult;
import org.alves.dataanalyze.utils.weidong.WaterMarkUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @Create by :Alves(412301546@qq.com)
 * @Localtion:杭州.China
 * @CreateTime :2018/7/17  12:53
 * @Version : v1.0.0
 * @Describe :
 *
 */
/**
 * Q:用FTPClient,执行到ftp.storeFile(fileName,  inputFile);无反应了
 *
 * A:  ftpclient.enterLocalPassiveMode();
 *
 * ftp.storeFile(fileName, inputFile);问题解决
 *
 * 原因是:FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
 * PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。
 * 当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XXXX端口,你过来连接我”。
 * 于是服务器从20端口向客户端的 XXXX端口发送连接请求,建立一条数据链路来传送数据。
 * PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。
 * 当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XXXX端口,你过来连接我”。
 * 于是客户端向服务器的XXXX端口 发送连接请求,建立一条数据链路来传送数据。
 *
 */
@RestController
@RequestMapping("/xxx")
public class SysFileController {
    //private final Logger logger = LoggerFactory.getLogger(getClass());
    //ftp服务器ip地址
    private static final String FTP_ADDRESS = "112.114.122.12";
    //端口号
    private static final int FTP_PORT = 21;
    //用户名
    private static final String FTP_USERNAME = "ftp********";
    //密码
    private static final String FTP_PASSWORD = "*********";
    //图片路径/ftp服务的目录
    private static final String FTP_BASEPATH = "/imgs";

    /**
     *上传图片到ftp服务器
     */
    @RequestMapping("upxxx")
    public String uploadimg(MultipartFile file) throws IOException {
      
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("UTF-8");

        // 获取文件名全名(都包括路径了)
        String originFileName = file.getOriginalFilename();

       String fileName = originFileName.substring(originFileName.lastIndexOf(Constants.SYS_SPLIT)+1);
       System.out.println("  文件名:        "+originFileName);

        InputStream input  = file.getInputStream();
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录

             ftp.enterLocalPassiveMode();//主动式和被动式
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return "disconnect";
            }

            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.makeDirectory(FTP_BASEPATH );
            System.out.println(ftp.changeWorkingDirectory(FTP_BASEPATH ));
            System.out.println(ftp.storeFile(FTP_BASEPATH+"/"+fileName,input));
            System.out.println(FTP_BASEPATH+"/"+fileName);
            input.close();
            ftp.logout();
           
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return "success";

    }

      
}

到此ftp文件服务器搭好了,也能上传到ftp目录下,ftp服务再配合nginx组成上传和访问

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值