使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器

使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器到此,使用java上传图片就完成了。

安装vsftp

1、首先,安装vsftpd

yum -y install vsftpd

2、验证是否安装成功

rpm -qa vsftpd

3、查看vsftp相关配置文件

ll /etc/vsftpd/

vsftpd.conf文件是主要的配置文件,一些关键的配置都在其中

ftpusers文件是禁止使用vsftpd的用户列表文件,记录不允许访问FTP服务器的用户名单

user_list这个文件禁止或允许使用vsftpd的用户列表文件,这个文件中指定的用户缺省情况(即在vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器

4、先备份一份vsftpd.conf文件

 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd-default.conf

5、修改vsftpd.conf配置文件

vim /etc/vsftpd/vsftpd.conf

image-20201112191932974

anonymous_enable=YES改为NO,表示不允许匿名访问

image-20201112192347055

然后把listen=NO改为YESlisten_ipv6=YES改为NO

再在该文件的最后添加以下数据:

#仅允许user_list文件中的用户访问FTP服务
userlist_deny=NO
#被动模式端口范围
pasv_min_port=30000
pasv_max_port=30999

6、创建一个用来登录FTP服务的用户

useradd ftpuser
passwd ftpuser
#输入两次密码

7、将ftpuser用户加进user_list文件最后一行

vim /etc/vsftpd/user_list

8、启动FTP服务

systemctl start vsftpd

9、服务器开放21端口和30000/30999端口范围

10、浏览器访问测试是否成功:

ftp://服务器ip地址/

Nginx进行配置

打开nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

修改以下内容

image-20201112200536867

重启nginx:

cd /usr/local/nginx/sbin/

./nginx -s reload

服务器开放端口:9999

Java实现上传图片的功能

1、添加依赖:

<dependency>
   <groupId>commons-net</groupId>
   <artifactId>commons-net</artifactId>
   <version>3.6</version>
</dependency>

2、application.properties配置文件添加以下内容:

#配置文件上传器
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
#ftp相关配置
#服务器地址
FTP.ADDRESS=192.168.xx.xxx
#FTP服务端口,默认是21
FTP.PORT=21
#访问FTP服务的用户名
FTP.USERNAME=ftpuser
#访问FTP服务的用户名对应的密码
FTP.PASSWORD=ftpuser
#图片存放在服务器指定的文件夹
FTP.BASEPATH=/home/ftpuser/images
#访问图片的基本url,如果端口号为80就不用加端口,192,168.xx.xxx为服务器ip地址
IMAGE.BASE.URL=http://192.168.xx.xxx:9999/images

3、FtpUtils:用于上传文件的工具类

public class FtpUtil {

    /** * Description: 向FTP服务器上传文件 * @param host FTP服务器ip * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param basePath FTP服务器基础目录,/home/ftpuser/images * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回true,否则返回false */  
    public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }

            //设置为被动模式
            ftp.enterLocalPassiveMode();
            //设置编码格式为utf-8
            ftp.setControlEncoding("UTF-8");
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //设置存储图片的文件夹
            ftp.changeWorkingDirectory(basePath);
            //上传文件
            if (!ftp.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
}

4、用于生成随机图片名

public class IDUtils {

    /** * 生成随机图片名 */
    public static String genImageName() {
        //取当前时间的长整形值包含毫秒
        long millis = System.currentTimeMillis();
        //long millis = System.nanoTime();
        //加上三位随机数
        Random random = new Random();
        int end3 = random.nextInt(999);
        //如果不足三位前面补0
        String str = millis + String.format("%03d", end3);
        
        return str;
    }
}

5、上传图片的Controller

/** * 上传图片 */
@Controller
@RequestMapping("/admin")
public class UploadController {

    @Value("${FTP.ADDRESS}")
    private String host;
    // 端口
    @Value("${FTP.PORT}")
    private int port;
    // ftp用户名
    @Value("${FTP.USERNAME}")
    private String userName;
    // ftp用户密码
    @Value("${FTP.PASSWORD}")
    private String passWord;
    // 文件在服务器端保存的主目录
    @Value("${FTP.BASEPATH}")
    private String basePath;
    // 访问图片时的基础url
    @Value("${IMAGE.BASE.URL}")
    private String baseUrl;

    /** * 上传图片到服务器 * @param uploadFile * @return */
    @PostMapping("/upload/file")
    public String pictureUpload(@RequestParam("file") MultipartFile file) {
        try {
            //1、给上传的图片生成新的文件名
            //1.1获取原始文件名
            String oldName = file.getOriginalFilename();
            //1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
            String newName = IDUtils.genImageName();
            newName = newName + oldName.substring(oldName.lastIndexOf("."));
            
            //2、把图片上传到图片服务器
            //2.1获取上传的io流
            InputStream input = file.getInputStream();
            //2.2调用FtpUtil工具类进行上传
            boolean result = FtpUtil.uploadFile(host, port, userName, passWord, basePath, newName, input);
            if(result) {
                //返回给前端图片访问路径
                return baseUrl+"/"+newName;
            }else {
                return "false";
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "false";
        }
    }
}

6、测试

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  <form action="/admin/upload/file" enctype="multipart/form-data" method="post">
       <input type="text" name="username"><br>
       <input type="password" name="password"><br>
       <input type="file" name="file"><br>
       <input type="submit" value="提交">
   </form>

</body>
</html>

7、提交图片后后端会返回一个图片路径,复制到地址栏看看是否能访问

到此,使用java上传图片就完成了。

今天的文章使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14104.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注