zoukankan      html  css  js  c++  java
  • 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/图片名+后缀

  • 相关阅读:
    Codeforces Round 269 (Div. 2)
    Codeforces Round 268 (Div. 2)
    杜教筛
    Codeforces Round 267(Div. 2)
    Codeforces Round 548 (Div. 2)
    Educational Codeforces Round 62 (Rated for Div. 2)
    数据结构编程实验——chapter9-应用二叉树的基本概念编程
    数据结构编程实验——chapter8-采用树结构的非线性表编程
    组合数学及其应用——polya计数
    《A First Course in Abstract Algebra with Applications》-chaper1-数论-棣莫弗定理
  • 原文地址:https://www.cnblogs.com/Dm920/p/12762287.html
Copyright © 2011-2022 走看看