当前位置: 首页 > 编程笔记 >

Java如何实现上传文件到服务器指定目录

从光启
2023-03-14
本文向大家介绍Java如何实现上传文件到服务器指定目录,包括了Java如何实现上传文件到服务器指定目录的使用技巧和注意事项,需要的朋友参考一下

前言需求

使用freemarker生成的静态文件,统一存储在某个服务器上。本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch。毕竟有现成的就很舒服,在此介绍给大家。

具体实现

引入的pom

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

<dependency>
	<groupId>com.jcraft</groupId>
	<artifactId>jsch</artifactId>
	<version>0.1.55</version>
</dependency>

建立实体类

public class ResultEntity {

  private String code;

  private String message;

  private File file;
  
  public ResultEntity(){}
  
	public ResultEntity(String code, String message, File file) {
		super();
		this.code = code;
		this.message = message;
		this.file = file;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}
  
}

public class ScpConnectEntity {
  private String userName;
  private String passWord;
  private String url;
  private String targetPath;

  public String getTargetPath() {
    return targetPath;
  }

  public void setTargetPath(String targetPath) {
    this.targetPath = targetPath;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getPassWord() {
    return passWord;
  }

  public void setPassWord(String passWord) {
    this.passWord = passWord;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

}

建立文件上传工具类

@Configuration

@Configuration
public class FileUploadUtil {

  @Value("${remoteServer.url}")
  private String url;

  @Value("${remoteServer.password}")
  private String passWord;

  @Value("${remoteServer.username}")
  private String userName;

  @Async
  public ResultEntity uploadFile(File file, String targetPath, String remoteFileName) throws Exception{
    ScpConnectEntity scpConnectEntity=new ScpConnectEntity();
    scpConnectEntity.setTargetPath(targetPath);
    scpConnectEntity.setUrl(url);
    scpConnectEntity.setPassWord(passWord);
    scpConnectEntity.setUserName(userName);

    String code = null;
    String message = null;
    try {
      if (file == null || !file.exists()) {
        throw new IllegalArgumentException("请确保上传文件不为空且存在!");
      }
      if(remoteFileName==null || "".equals(remoteFileName.trim())){
        throw new IllegalArgumentException("远程服务器新建文件名不能为空!");
      }
      remoteUploadFile(scpConnectEntity, file, remoteFileName);
      code = "ok";
      message = remoteFileName;
    } catch (IllegalArgumentException e) {
      code = "Exception";
      message = e.getMessage();
    } catch (JSchException e) {
      code = "Exception";
      message = e.getMessage();
    } catch (IOException e) {
      code = "Exception";
      message = e.getMessage();
    } catch (Exception e) {
      throw e;
    } catch (Error e) {
      code = "Error";
      message = e.getMessage();
    }
    return new ResultEntity(code, message, null);
  }


  private void remoteUploadFile(ScpConnectEntity scpConnectEntity, File file,
                 String remoteFileName) throws JSchException, IOException {

    Connection connection = null;
    ch.ethz.ssh2.Session session = null;
    SCPOutputStream scpo = null;
    FileInputStream fis = null;

    try {
      createDir(scpConnectEntity);
    }catch (JSchException e) {
      throw e;
    }

    try {
      connection = new Connection(scpConnectEntity.getUrl());
      connection.connect();

      if(!connection.authenticateWithPassword(scpConnectEntity.getUserName(),scpConnectEntity.getPassWord())){
        throw new RuntimeException("SSH连接服务器失败");
      }
      session = connection.openSession();

      SCPClient scpClient = connection.createSCPClient();

      scpo = scpClient.put(remoteFileName, file.length(), scpConnectEntity.getTargetPath(), "0666");
      fis = new FileInputStream(file);

      byte[] buf = new byte[1024];
      int hasMore = fis.read(buf);

      while(hasMore != -1){
        scpo.write(buf);
        hasMore = fis.read(buf);
      }
    } catch (IOException e) {
      throw new IOException("SSH上传文件至服务器出错"+e.getMessage());
    }finally {
      if(null != fis){
        try {
          fis.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if(null != scpo){
        try {
          scpo.flush();
//          scpo.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if(null != session){
        session.close();
      }
      if(null != connection){
        connection.close();
      }
    }
  }


  private boolean createDir(ScpConnectEntity scpConnectEntity ) throws JSchException {

    JSch jsch = new JSch();
    com.jcraft.jsch.Session sshSession = null;
    Channel channel= null;
    try {
      sshSession = jsch.getSession(scpConnectEntity.getUserName(), scpConnectEntity.getUrl(), 22);
      sshSession.setPassword(scpConnectEntity.getPassWord());
      sshSession.setConfig("StrictHostKeyChecking", "no");
      sshSession.connect();
      channel = sshSession.openChannel("sftp");
      channel.connect();
    } catch (JSchException e) {
      e.printStackTrace();
      throw new JSchException("SFTP连接服务器失败"+e.getMessage());
    }
    ChannelSftp channelSftp=(ChannelSftp) channel;
    if (isDirExist(scpConnectEntity.getTargetPath(),channelSftp)) {
      channel.disconnect();
      channelSftp.disconnect();
      sshSession.disconnect();
      return true;
    }else {
      String pathArry[] = scpConnectEntity.getTargetPath().split("/");
      StringBuffer filePath=new StringBuffer("/");
      for (String path : pathArry) {
        if (path.equals("")) {
          continue;
        }
        filePath.append(path + "/");
        try {
          if (isDirExist(filePath.toString(),channelSftp)) {
            channelSftp.cd(filePath.toString());
          } else {
            // 建立目录
            channelSftp.mkdir(filePath.toString());
            // 进入并设置为当前目录
            channelSftp.cd(filePath.toString());
          }
        } catch (SftpException e) {
          e.printStackTrace();
          throw new JSchException("SFTP无法正常操作服务器"+e.getMessage());
        }
      }
    }
    channel.disconnect();
    channelSftp.disconnect();
    sshSession.disconnect();
    return true;
  }

  private boolean isDirExist(String directory,ChannelSftp channelSftp) {
    boolean isDirExistFlag = false;
    try {
      SftpATTRS sftpATTRS = channelSftp.lstat(directory);
      isDirExistFlag = true;
      return sftpATTRS.isDir();
    } catch (Exception e) {
      if (e.getMessage().toLowerCase().equals("no such file")) {
        isDirExistFlag = false;
      }
    }
    return isDirExistFlag;
  }
}

属性我都写在Spring的配置文件里面了。将这个类托管给spring容器。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Java上传文件到服务器指定文件夹实现过程图解,包括了Java上传文件到服务器指定文件夹实现过程图解的使用技巧和注意事项,需要的朋友参考一下 核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。 *如何分片; *如何合成一个文件; *中断了从哪个分片开始。 如何分,利用强大的js库,来减轻我们的工作,

  • 本文向大家介绍java实现将文件上传到ftp服务器的方法,包括了java实现将文件上传到ftp服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现将文件上传到ftp服务器的方法。分享给大家供大家参考,具体如下: 工具类: 读取配置文件: 将文件上传ftp: 更多关于java相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教

  • 问题内容: 我创建了一个从有权访问的FTP服务器下载文件的功能。如何将文件上传回FTP服务器? 以下是我使用的download_files方法: 问题答案: 使用Apache Commons Net库中的FTPClient类。 这是一个带有示例的代码段: 摘录自http://www.kodejava.org/examples/356.html

  • 本文向大家介绍Java实现文件上传服务器和客户端,包括了Java实现文件上传服务器和客户端的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下 文件上传服务器端: 文件上传客户端: 本文已被整理到了《Java上传操作技巧汇总》,欢迎大家学习阅读。  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐

  • 本文向大家介绍基于HTML5+js+Java实现单文件文件上传到服务器功能,包括了基于HTML5+js+Java实现单文件文件上传到服务器功能的使用技巧和注意事项,需要的朋友参考一下 上传单文件到服务器                                                        应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,

  • 本文向大家介绍python实现获取客户机上指定文件并传输到服务器的方法,包括了python实现获取客户机上指定文件并传输到服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现获取客户机上指定文件并传输到服务器的方法。分享给大家供大家参考。具体分析如下: 该程序实现了,把目标机器的某个目录(可控)的所有的某种类型文件(可控)全部获取并传到己方的机器上。 1、用了bas