通过Java FTPS上传文件到centos服务器

首先在linux系统种安装vsftpd,然后设置SSL加密,这些就不说了,主要说一下代码

package com.numberone.master.test.web;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;

import java.io.File;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.NoSuchAlgorithmException;

public class FtpsDemo {
    /**
     * 本地字符编码
     */
    private static String LOCAL_CHARSET = "GBK";

    // FTP协议文件名编码为iso-8859-1
    private static String SERVER_CHARSET = "ISO-8859-1";

    public static void main(String[] args) throws NoSuchAlgorithmException {

        String path = "C:/loga/cftsl_202107.txt";
        String fileName = "cftsl_202107.txt";
        String protocol = "SSL";
        File file = new File(path);
        try {
            FTPSClient ftpsClient = new FTPSClient(protocol);
            ftpsClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
            InputStream fis = new FileInputStream(file);
            ftpsClient.connect("192.168.168.151", 22190);
            ftpsClient.login("aubin", "aubin");//FTP的用户名和密码
            // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
            if (FTPReply.isPositiveCompletion(ftpsClient.sendCommand(
                    "OPTS UTF8", "ON"))) {
                LOCAL_CHARSET = "UTF-8";
            }
            ftpsClient.execPBSZ(0);
            ftpsClient.execPROT("P");
            ftpsClient.setControlEncoding(LOCAL_CHARSET);
            ftpsClient.enterLocalPassiveMode();
            ftpsClient.setFileType(FTP.BINARY_FILE_TYPE);
            //改变文件路径
            boolean changeFlag = ftpsClient.changeWorkingDirectory("/home/aubin/indicator");
            System.out.println(changeFlag);
            if (ftpsClient.storeFile(fileName, fis)) {
                System.out.println("成功");
            } else {
                System.out.println("失败");
            }

            ftpsClient.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

该代码可以上传文件,可以上传文件,可以上传文件

遇到的问题如下
1. 可以成功登陆,但是上传的时候连接超时
该问题因为登陆的时候用的是指定的端口,但是上传因为设置了被动模式会另外启用其它数据端口,而我的防火墙就打开了两个端口,所以就一直连接超时,

这边我处理方法是关闭防火墙,然后就可以了

[root@aubin vsftpd]# systemctl stop firewalld.service

在这里插入图片描述

还有一个方法是设置数据端口值,然后打开对应端口范围就可以了

2.可以上传文件,但是文件没有内容

之前我一直怀疑大概率是我代码的问题,小部分是ftps设置问题,就一直百度代码相关的操作,各种方法也试了,最后直接把日志打印出来,看日志什么问题
通过日志发现是配置文件的问题

[root@aubin vsftpd]# vim /etc/vsftpd/vsftpd.conf

加上如下配置

require_ssl_reuse=no //需要数据与控制流使用相同的ssl通道

为什么要设置这个,因为我们当我们连接ftp的时候就启用了一个ssl通道用于控制,当我们代码想要传输的时候,又设置了被动模式启用了另外的ssl通道,所以数据与控制流没有使用相同的ssl通道,我们就不能将这项配置设置为YES

设置好了之后关闭重启一下ftp服务

[root@aubin vsftpd]# systemctl stop vsftpd
[root@aubin vsftpd]# systemctl start vsftpd

最后实验一下,发现就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值