Linux

一、上传与下载

使用Java将文件、图片等通过ftp协议上传到linux中

1)Linux配置

在上传与下载之前,首先在linux中安装并配置FTP服务器,这里使用的是vsftpd。

① 安装 vsftpd

 yum install -y vsftpd

② 设置 vsftpd 服务,开机自启

systemctl enable vsftpd

③ 启动 vsftpd 服务

systemctl start vsftpd.service

④ 在防火墙中开启21端口号(这里使用的是CentOs7以后的版本)

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

⑤ 添加用户

#添加用户
[root@linuxtest ~]useradd ftpuser (用户名)
#设置密码
[root@linuxtest ~]passwd ftpuser (密码)

注意:添加用户成功后,将在 /home 文件下多个 /ftpuser 文件,/home/ftpuser 是用户 ftpuser 登录后的默认路径,此用户上传文件,只能传到 /home/ftpuser 目录下。

⑥ 修改vsftp配置文件,禁止匿名登录

[root@linuxtest ~]vim /etc/vsftpd/vsftpd.conf 
把:anonymous_enable
=YES 改为: anonymous_enable=NO Esc---> :wq! 保存退出

2)导入依赖

<!-- FtpClient依赖包 -->
<
dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency>

3)上传

/**
 * Description: 向FTP服务器上传文件
 *
 * @param host     FTP服务器hostname
 * @param port     FTP服务器端口
 * @param username FTP登录账号
 * @param password FTP登录密码
 * @param filePath FTP服务器文件存放路径。
 * @param filename 上传到FTP服务器上的文件名
 * @param input    输入流
 * @return 成功返回true,否则返回false
 */
public boolean uploadFile(String host, int port, String username, String password,
                          String filePath, String filename, InputStream input) throws IOException {

    FTPClient ftpClient = new FTPClient();
    try {
        int reply;
        logger.info("连接FTP服务器");
        ftpClient.connect(host, port);

        logger.info("登录");
        ftpClient.login(username, password);

        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            logger.info("FTP连接失败");
            ftpClient.disconnect();
            return false;
        }

        ftpClient.setControlEncoding("utf-8");// 解决上传文件时文件名乱码
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置上传文件的类型为二进制类型

        logger.info("切换到上传目录");
        if (!ftpClient.changeWorkingDirectory(filePath)) {
            logger.info("目录不存在===>创建目录");
            if (!ftpClient.makeDirectory(filePath)) {
                logger.error("目录创建失败");
                return false;
            } else {
                logger.info("进入上传目录");
                ftpClient.changeWorkingDirectory(filePath);
            }
        }

        ftpClient.setBufferSize(1024); // 设置缓存区
        ftpClient.enterLocalPassiveMode();// 开通一个端口来传输数据

        logger.info("上传文件");
        if (!ftpClient.storeFile(filename, input)) {
            logger.info("上传失败");
            return false;
        }
        ftpClient.logout();
    } catch (IOException e) {
        logger.info("文件上传异常", e);
        e.printStackTrace();
    } finally {
        logger.info("断开FTP连接");
        ftpClient.disconnect();
    }
    return true;
}

4)下载

/**
 * Description: 从FTP服务器下载文件
 *
 * @param host       FTP服务器hostname
 * @param port       FTP服务器端口
 * @param username   FTP登录账号
 * @param password   FTP登录密码
 * @param remotePath FTP服务器上的相对路径
 * @param fileName   要下载的文件名
 * @param localPath  下载后保存到本地的路径
 * @return
 */
public boolean downloadFile(String host, int port, String username, String password, String remotePath,
                            String fileName, String localPath) throws IOException {
    FTPClient ftpClient = new FTPClient();
    try {
        int reply;
        logger.info("连接FTP服务器");
        ftpClient.connect(host, port);

        logger.info("登录");
        ftpClient.login(username, password);

        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            logger.info("FTP连接失败");
            ftpClient.disconnect();
            return false;
        }

        logger.info("进入FTP服务器下载目录");
        if (!ftpClient.changeWorkingDirectory(remotePath)) {
            logger.info("目录不存在");
            return false;
        }

        logger.info("匹配查找文件");
        FTPFile[] fs = ftpClient.listFiles();
        for (FTPFile ff : fs) {
            if (ff.getName().equals(fileName)) {
                logger.info("开始下载");
                File localFile = new File(localPath + "/" + ff.getName());
                OutputStream is = new FileOutputStream(localFile);
                ftpClient.retrieveFile(ff.getName(), is);
                is.close();
                logger.info("下载完成");
            } else {
                logger.info("找不到文件");
            }
        }
        ftpClient.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        logger.info("断开FTP连接");
        ftpClient.disconnect();
    }
    return true;
}

二、访问 Linux 服务器的文件(以图片为例)

编写服务端代码时,将前端传来的图片保存至服务器,并将路径保存到数据库中,当前端需要访问该图片时,不想利用二进制流传输,而是让前端利用 url 直接访问该图片。

如图,Linux 服务器 /root/ftproot/picture 路径下保存有图片,需要在浏览器中可以直接根据 url 访问到

此 Linux 服务器需要配置有 Tomcat

① 编辑 Tomcat 中的 Service.xml 文件

进入 Tomcat 的 conf 文件夹下编辑 server.xml 文件

vim server.xml

在文件的末尾部分加入

# docBase: 要访问图片所在的路径
# path: 虚拟路径
 
<Context docBase="/root/ftproot/picture" path="/picture" debug="0" reloadable="true" />

Esc -> :wq 保存退出

② 重启 Tomcat

# 关闭
./shutdown.sh
# 启动
./startup.sh

③ 访问测试:http://ip:tomcat的端口/上文配置中的 path/图片名+后缀

原文地址:https://www.cnblogs.com/Dm920/p/12762287.html