java-文件上传下载且文件服务器操作

  • Post author:
  • Post category:java




1.文件上传

1.1后端使用MultipartFile接收上传的文件,并返回文件全路径地址(完整的网络地址,其中文件存储地址是通过nginx配置的映射路径。eg:http://8.142.104.85/testFile/333.png)

步骤:

1.后端使用MultipartFile接收到文件。

2.代码中操作登录远程服务器,并将文件流读入到服务器指定文件夹。

3.返回文件相对路径地址并保存,eg:/testFile/333.png

4.想要获取文件全路径,就在文件相对路径前面拼上nginx配置的文件映射路径。eg:http://8.142.104.85/testFile/333.png



2.文件下载(通常有两种方式)

2.1网络地址方式(接口拼接并返回完整网络地址,由前端处理预览、下载等功能。这种比较常用)

步骤:

1.从数据库中获取文件相对路径。eg:/testFile/333.png

2.获取nginx配置的文件映射路径并拼接文件相对路径。eg:http://8.142.104.85/testFile/333.png

3.返回该路径,交由前端处理。

2.1文件流方式(后端获取拼接文件地址并读取文件流后写到response中返回给前端,前端拿到流之后就可以转换为文件且进行下载或预览。注意:前端需要设置 responseType: ‘blob’)

步骤

1.通过后端接口接收到文件相关路径。

2.登录服务器并下载文件到临时文件夹。

3.从临时文件夹中读取文件并转成字节数组。

4.将字节数组写入response中并返回给前端。

5.删除临时文件。



远程服务器操作通用代码如下:

package com.mozheng.manageframe.mmmm;

import com.jcraft.jsch.*;

import java.io.*;
import java.util.Objects;
import java.util.Properties;
import java.util.Vector;

/**
 * @Description: 服务器登录、关闭,文件上传、下载,命令执行
 */
public class SSHRemoteCall {

    /**
     * ip地址
     **/
    private static String ipAddress = "8.142.124.85";
    /**
     * 端口号
     **/
    private static int port = 22;
    /**
     * 账号
     **/
    private static String userName = "服务器账号名称";
    /**
     * 密码
     **/
    private static String password = "服务器账号密码";
    /**
     * JSCH session
     **/
    private Session session;

    /**
     * 登录远程服务器
     * @param ipAddress ip地址
     * @param port 端口
     * @param userName 账号名称
     * @param password 账号密码
     * @return void
     **/
    public void sshLogin(String ipAddress, int port, String userName, String password) throws Exception {
        JSch jSch = new JSch();
        try {
            // 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象
            session = jSch.getSession(userName, ipAddress, port);
            session.setPassword(password);
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            // 设置超时
            session.setTimeout(3000);
            session.connect();
        } catch (JSchException e) {
            System.out.println("连接远程服务异常。。。。。。");
        }
    }

    /**
     * 关闭连接
     * @return void
     **/
    public void closeSession() {
        if (!Objects.isNull(session)) {
            session.disconnect();
        }
    }

    /**
     * 执行相关的命令
     * @param command 命令
     */
    public void execCommand(String command) throws IOException {
        InputStream in = null;// 输入流(读)
        Channel channel = null;// 定义channel变量
        try {
            // 如果命令command不等于null
            if (command != null) {
                // 打开channel
                //说明:exec用于执行命令;sftp用于文件处理
                channel = session.openChannel("exec");
                // 设置command
                ((ChannelExec) channel).setCommand(command);
                // channel进行连接
                channel.connect();
                // 获取到输入流
                in = channel.getInputStream();
                // 执行相关的命令
                String processDataStream = processDataStream(in);
                // 打印相关的命令
                System.out.println("1、打印相关返回的命令: " + processDataStream);
            }
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (channel != null) {
                channel.disconnect();
            }
        }
    }

    /**
     * 对将要执行的linux的命令进行遍历
     * @param in
     * @return java.lang.String
     **/
    public String processDataStream(InputStream in) throws Exception {
        StringBuffer sb = new StringBuffer();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String result = "";
        try {
            while ((result = br.readLine()) != null) {
                sb.append(result);
            }
        } catch (Exception e) {
            throw new Exception("获取数据流失败: " + e);
        } finally {
            br.close();
        }
        return sb.toString();
    }

    /**
     * 上传文件
     * @param directory 文件上传目标地址 eg:/tmp/333.png
     * @param uploadFile 文件本地地址 eg:C:\\Users\\15156\\Desktop\\b3d6523b-f86e-4fa2-b40a-16002ea2358a.png
     * @return void
     **/
    public void uploadFile(String directory, String uploadFile) throws JSchException, FileNotFoundException, SftpException {
        // 打开channelSftp
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        // 远程连接
        channelSftp.connect();
        // 创建一个文件名称问uploadFile的文件
        File file = new File(uploadFile);
        // 将文件进行上传(sftp协议)
        // 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同.
        // 采用默认的传输模式:OVERWRITE
        channelSftp.put(new FileInputStream(file), directory, ChannelSftp.OVERWRITE);
        // 切断远程连接
        channelSftp.exit();
        System.out.println(file.getName() + " 文件上传成功.....");
    }

    /**
     * 下载文件
     * 采用默认的传输模式:OVERWRITE
     *
     * @param src inux服务器文件地址 eg:/tmp/333.png
     * @param dst 本地存放地址 eg:C:\\Users\\15156\\Desktop\\
     * @return void
     **/
    public void fileDownload(String src, String dst) throws JSchException, SftpException {
        // src 是linux服务器文件地址,dst 本地存放地址
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        // 远程连接
        channelSftp.connect();
        // 下载文件,多个重载方法
        channelSftp.get(src, dst);
        // 切断远程连接,quit()等同于exit(),都是调用disconnect()
        channelSftp.quit();
        // channelSftp.disconnect();
        System.out.println(src + " 下载文件成功");
    }

    /**
     * 删除指定文件
     *
     * @param directoryFile 要删除文件全路径 eg:/user/local/333.png
     * @return void
     **/
    public void deleteFile(String directoryFile) throws SftpException, JSchException {
        // 打开openChannel的sftp
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        // 远程连接
        channelSftp.connect();
        // 删除文件
        channelSftp.rm(directoryFile);
        // 切断远程连接
        channelSftp.exit();
        System.out.println(directoryFile + "已删除");
    }

    /**
     * 列出目录下的文件
     *
     * @param directory 文件所在目录 eg:/user/local
     * @return java.util.Vector
     **/
    public Vector listFiles(String directory) throws JSchException, SftpException {
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        // 远程连接
        channelSftp.connect();
        // 显示目录信息
        Vector ls = channelSftp.ls(directory);
        // 切断连接
        channelSftp.exit();
        return ls;
    }

    public static void main(String[] args) {
        // 连接到指定的服务器
        SSHRemoteCall sshRemoteCall = new SSHRemoteCall();
        try {
            // 1、首先远程连接ssh
            sshRemoteCall.sshLogin(ipAddress, port, userName, password);
            // 打印信息
            System.out.println("ip地址: " + ipAddress + ",账号: " + userName + ",连接成功.....");

            // 2、执行相关的命令
            // 查看磁盘空间大小
            // String command = "df -lh ";
            // 查看cpu的使用情况
            String command = "top -bn 1 -i -c ";
            sshRemoteCall.execCommand(command);

            // 3、上传文件
            /*String directory = "/tmp/333.png";// 目标文件名
            String uploadFile = "C:\\Users\\15156\\Desktop\\b3d6523b-f86e-4fa2-b40a-16002ea2358a.png";// 本地文件名
            SSHRemoteCall.getInstance().uploadFile(directory, uploadFile);*/

            // 4、下载文件
            // src 是linux服务器文件地址,dst 本地存放地址,采用默认的传输模式:OVERWRITE
            //test为文件名称哈
            /*String src = "/tmp/333.png";
            String dst = "C:\\Users\\15156\\Desktop\\";
            SSHRemoteCall.getInstance().fileDownload(src, dst);*/

            // 5、刪除文件
            /*String deleteDirectoryFile = "/tmp/333.png";
            SSHRemoteCall.getInstance().deleteFile(deleteDirectoryFile);*/

            // 展示目录下的文件信息
            String lsDirectory = "/tmp";
            Vector vector = sshRemoteCall.listFiles(lsDirectory);
            vector.stream().forEach(item -> System.out.println(item.toString()));
        } catch (Exception e) {
            System.err.println("远程连接失败......" + e);
        } finally {
            // 关闭连接
            sshRemoteCall.closeSession();
        }
    }
}



版权声明:本文为weixin_42402326原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。