Java FtpClient 实现文件上传服务

一、Ubuntu 安装 Vsftpd 服务

   1、安装    

sudo apt-get install vsftpd

   2、添加用户(uftp)

sudo useradd -d /home/uftp -s /bin/bash uftp

   3、设置用户密码

sudo useradd -d /home/uftp -s /bin/bash uftp

   4、创建用户目录

sudo mkdir /home/uftp

   5、设置用户密码

sudo passwd uftp

   6、设置/etc/vsftpd.conf配置文件

sudo vim /etc/vsftpd.conf

    a、修改上传文件的权限:

      这里会有一个问题,默认情况下的默认权限是 077 也就是对应Linux 中的700 计算规则是 linux 的权限 777 - local_umask

      如果没有设置local_umask 文件权限,会导致上传之后的文件,我们无法通过服务器访问(缺少权限) 

    b、在配置文件末尾添加:

userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
seccomp_sandbox=NO
local_enable=YES

    c、设置上传文件权限:

write_enable = YES

    这里如果不设置成YES 默认情况下不允许上传文件。

   7、创建/etc/allowed_users

    添加允许任务加入到文件中,

    8、重启服务

sudo service vsftpd restart

   9、使用XFTP 测试连接

    使用XFtp 创建一个新的连接,这里需要注意选择的协议ftp,端口是21,在填写好账号密码之后,即可以连接我们的服务器。

  测试上传文件:

    这里上传了一个txt 文件,我们可以看到文件的权限是666,这里主要就是因为我们设置了上传文件之后的权限 local_umask.

二、Java FtpClient 实现文件上传

    1、Maven 依赖

<!-- Apache工具组件 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
        </dependency>

    2、创建FtpClient 对象远程连接服务器

            FTPClient ftp = new FTPClient();
            //链接远程服务
            ftp.connect("192.168.148.128", 21);

      连接结果可以debug 看到:

    3、FtpClient  登录服务器

            ftp.login("uftp", "**");
            //返回登录结果状态
            int reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return ;
            }

    我们可以通过判断replyCode 和replyString 来查看用户是否登录成功!

    4、修改文件上传路径和文件类型

            //修改上传文件路径
            ftp.changeWorkingDirectory("/home/uftp/images/");
            //修改文件类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);    

     5、上传文件

            //获取上传文件的输入流
            FileInputStream fileInputStream = new FileInputStream(new File("D:/123.jpg"));
            //把文件推到服务器上
            ftp.storeFile("hello.jpg", fileInputStream);

      上传文件完成之后,通过查看返回结果判断时候上传成功

    6、退出登录

            //退出登录
            ftp.logout();

     以上步骤就是使用FtpClient完成了一次文件上传操作。

 三、使用Nginx 查看服务器图片

    1、nginx 配置文件

      在server 中添加 图片地址解析

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt)${
     root /home/uftp/images;
     expires 7d;  
}   

     2、重启Nginx

./nginx -s reload

    3、查看图片

http://192.168.148.128/hello.jpg

   总结:到这里我们就完成了一个简单的图片上传到服务器,并且展示的小demo,配置过程中主要碰到的问题是关于文件权限的问题,如果没有设置vsftpd 中的配置文件中local_umask,即使我们成功上传了文件,也无法使用nginx 进行浏览,设置write_enable = YES 保证文件能够上传。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JadePeng的技术博客

Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需...

3438
来自专栏程序员互动联盟

玩转linux只需要几个命令

linux一说都是搞开发玩的,敲敲键盘就能完成所有的工作。其实你也可以这么玩,玩游戏的除外哦。 那我们就来侃侃如何玩,linux是命令的天下,高级的命令那是相...

3399
来自专栏阮一峰的网络日志

Docker 微服务教程

Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储...

4514
来自专栏应用案例

docker搭建私有仓库

序言 黄金指,一不小心就弄出一个故障。。。好可怕好可怕,我的小心脏。。。我的小心眼。。。 我这么信任你,你居然欺骗我。。。。****,这么大的坑,填不满啊。。。...

3657
来自专栏电光石火

CentOS6.5安装Java 8以及Tomcat8

如果出现如图,说明没有安装 如果以前已经安装就卸载

32410
来自专栏13blog.site

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites

前言 今天一个朋友让我帮他做一下tomcat的https配置,中间遇到了标题中这个错误,因此记录了一下过程,服务器、域名、证书、tomcat都已经准备好,就是需...

3658
来自专栏SDNLAB

SSL及Nginx代理搭建环境的Docker仓库

使用私有仓库有许多优点:节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;提供镜像资源利用,针对于公司内部使用的镜像,推...

3586
来自专栏奇梦博客

云服务器只开放子账号ssh登录,获得root权限方法 原创 Linux 面板

1173
来自专栏java沉淀

centos 7 安装mysql这个版本的数据库是没有my.cnf需要创建my.cnfsql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

1303
来自专栏崔庆才的专栏

Docker 微服务教程

1153

扫描关注云+社区