Java 跨Linux服务器进行文件的上传和下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014338530/article/details/84580696

项目迁移,之前在服务器A上面的项目因为需求需要迁移至服务器B,该项目使用的是A服务器上的一个图片库地址,所以需要对图片上传和下载功能进行修改,满足可以跨服务器进行操作。

使用的是SCPClient,进行操作。首先是Maven依赖

<dependency>
     <groupId>ch.ethz.ganymed</groupId>
     <artifactId>ganymed-ssh2</artifactId>
     <version>build210</version>
</dependency>

其次工具类代码如下:

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.apache.log4j.Logger;

import java.io.*;


public class LinuxFileUploadUtils {

    private static Logger logger = Logger.getLogger(LinuxFileUploadUtils.class);
    private static String IP = "*********";
    private static int PORT = ****;
    private static String USER = "*******";//登录用户名
    private static String PASSWORD = "";//生成私钥的密码和登录密码,这两个共用这个密码
    private static Connection connection = new Connection(IP, PORT);
    private static String PRIVATEKEY = "*******";// 本机的私钥文件地址
    private static boolean usePassword = false;// 使用用户名和密码来进行登录验证。如果为true则通过用户名和密码登录,false则使用rsa免密码登录
    private static final String DEFAULTCHART = "UTF-8";

    /**
     * ssh用户登录验证,使用用户名和密码来认证
     *
     * @param user
     * @param password
     * @return
     */
    public static boolean isAuthedWithPassword(String user, String password) {
        try {
            return connection.authenticateWithPassword(user, password);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * ssh用户登录验证,使用用户名、私钥、密码来认证 其中密码如果没有可以为null,生成私钥的时候如果没有输入密码,则密码参数为null
     *
     * @param user
     * @param file
     * @param password
     * @return
     */
    public static boolean isAuthedWithPublicKey(String user, File file, String password) {
        try {
            return connection.authenticateWithPublicKey(user, file, password);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    public static boolean isAuth() {
        if (usePassword) {
            return isAuthedWithPassword(USER, PASSWORD);
        } else {
            File file = new File(PRIVATEKEY);
            if (file.exists()) {
                return isAuthedWithPublicKey(USER, file, PASSWORD);
            }
            return false;
        }
    }

    public static void getFile(String remoteFile, String path) {
        try {
            connection.connect();
            boolean isAuthed = isAuth();
            if (isAuthed) {
                System.out.println("认证成功!");
                SCPClient scpClient = connection.createSCPClient();
                scpClient.get(remoteFile, path);
            } else {
                System.out.println("认证失败!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            connection.close();
        }
    }

    public static void putFile(String localFile, String remoteName, String remoteTargetDirectory, String mode) {
        try {
            connection.connect();
            boolean isAuthed = isAuth();
            if (isAuthed) {
                SCPClient scpClient = connection.createSCPClient();
                scpClient.put(localFile, remoteName, remoteTargetDirectory, mode);
            } else {
                logger.info("认证失败!");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            connection.close();
        }
    }

    public static void putFile(String localFile, String remoteTargetDirectory) {
        try {
            connection.connect();
            boolean isAuthed = isAuth();
            if (isAuthed) {
                SCPClient scpClient = connection.createSCPClient();
                scpClient.put(localFile, remoteTargetDirectory);
            } else {
                logger.info("认证失败!");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            connection.close();
        }
    }

}

这里基本上就完事了,这里需要说明一下,由于项目需要,是在项目所在服务器B上保留一份图片,然后在A服务器上的图片库在进行保留,所以工作流程是先再服务器B上保存,然后推送至服务器A上。这里因为使用的是Spring Boot,内置tomcat存在文件大小的限制(2M?),所以要对文件大小进行设置。新建一个config配置文件类,使用@configeration进行注解,也可以直接写在Spring Boot的启动类下面,代码如下:

@Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //单个文件最大
        factory.setMaxFileSize("10MB");//可以使M,KB
        /// 设置总上传数据总大小
        factory.setMaxRequestSize("100MB");可以使M,KB
        return factory.createMultipartConfig();
    }

如有不对,请大神不惜在下面留言,谢谢!

猜你喜欢

转载自blog.csdn.net/u014338530/article/details/84580696
今日推荐