首页 > 编程语言 >java上传文件到指定服务器

java上传文件到指定服务器

时间:2023-10-23 13:44:37浏览次数:36  
标签:java String sftp host directory 服务器 SFTP 上传 append

Java上传文件到指定主机
必须条件
先决条件是要知道上传到指定的主机,需要知道它的用户密码。

代码
pom.xml
<!--图片上传到服务器需要的依赖-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>

application.yml 配置文件
customize:
remoteServer:
sftp:
SFTP_httpBaseUrl: /images/ # 访问附件的地址添加 一个映射 如 /images/ -》 /server-images/
SFTP_httpPort: 80 # 公网访问的端口
SFTP_directory: /server-images/ #主机保存附件目录
SFTP_host: 192.168.1.10 #主机
SFTP_port: 22 #端口号
SFTP_username: root #用户名
SFTP_password: 123456 #密码

上传文件的工具类
package com.cfl.jd.util;

import com.jcraft.jsch.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;
import java.util.Properties;
import java.util.UUID;


/**
* 类描述:
* 上传文件到服务器的 工具类
*
* @ClassName SFTPUtil
* @Author msi
* @Date 2020/9/2 23:29
* @Version 1.0
*/
@Component
public class SFTPUtil {

/**
* 返回公网访问的地址前缀
*/
@Value("${customize.remoteServer.sftp.SFTP_httpBaseUrl}")
protected String baseUrl;
/**
* 公网访问的端口
*/
@Value("${customize.remoteServer.sftp.SFTP_httpPort}")
protected int port;
/**
* 主机保存的目录
*/
@Value("${customize.remoteServer.sftp.SFTP_directory}")
protected String directory;
/**
* 主机的IP
*/
@Value("${customize.remoteServer.sftp.SFTP_host}")
protected String host;
/**
* ssh端口
*/
@Value("${customize.remoteServer.sftp.SFTP_port}")
protected int sshPort;
/**
* 用户名
*/
@Value("${customize.remoteServer.sftp.SFTP_username}")
protected String username;
/**
* 密码
*/
@Value("${customize.remoteServer.sftp.SFTP_password}")
protected String password;

/**
* 上传多文件到指定远程主机
* @param files 文件数组
* @return list
*/
public List<String> uploadMultipartFilesToServer(MultipartFile[] files) throws SftpException, JSchException, IOException {
List<String> list = new ArrayList<>();
ChannelSftp sftp = null;
Session session = null;
sftp = this.connect(this.host, this.sshPort, this.username, this.password);
session = sftp.getSession();
for (int i = 0; i < files.length; i++) {
String originalFilename = files[i].getOriginalFilename();
// 生成文件夹名 yyyy-mm
String relativePath = new StringBuilder().append(LocalDate.now().getYear())
.append("-").append(LocalDate.now().getMonthValue()).toString();

String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();

int lastIndex = originalFilename.lastIndexOf(".");
String fileSuffix = originalFilename.substring(lastIndex);
String filePrefix = originalFilename.substring(0, lastIndex);
String fileName = new StringBuilder().append(filePrefix).append(uuid).append(fileSuffix).toString();

// 文件上层目录
String directory = this.directory + relativePath;
// 创建文件夹
this.createDir(directory, sftp);
// 进入文件夹内
sftp.cd(directory);
// 创建文件
sftp.put(files[0].getInputStream(), fileName);
// 拼接返回格式
String s = new StringBuilder("http://").append(this.host).append(":").append(this.port)
.append(this.baseUrl).append(relativePath).append("/").append(fileName).toString();

list.add(s);
}
// 关掉连接
sftp.disconnect();
sftp.getSession().disconnect();

return list;
}

/**
* 建立连接
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
* @return
*/
public ChannelSftp connect(String host, int port, String username,
String password) {
ChannelSftp sftp = null;
try {
JSch jsch = new JSch();
jsch.getSession(username, host, port);
Session sshSession = jsch.getSession(username, host, port);
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
} catch (Exception e) {
e.printStackTrace();
}
return sftp;
}

/**
* 创建目录
*
*/
public void createDir(String createpath, ChannelSftp sftp) {
try {
if (isDirExist(sftp, createpath)) {
sftp.cd(createpath);
}
String pathArry[] = createpath.split("/");
StringBuffer filePath = new StringBuffer("/");
// 循环创建目录
for (String path : pathArry) {
if (path.equals("")) {
continue;
}
filePath.append(path + "/");
if (isDirExist(sftp, filePath.toString())) {
sftp.cd(filePath.toString());
} else {
// 建立目录
sftp.mkdir(filePath.toString());
// 进入并设置为当前目录
sftp.cd(filePath.toString());
}
}
sftp.cd(createpath);
} catch (SftpException e) {
e.printStackTrace();
}
}


/**
* 判断目录是否存在
*/
public boolean isDirExist(ChannelSftp sftp, String directory) {
boolean isDirExistFlag = false;
try {
SftpATTRS sftpATTRS = sftp.lstat(directory);
isDirExistFlag = true;
return sftpATTRS.isDir();
} catch (Exception e) {
if (e.getMessage().toLowerCase().equals("no such file")) {
isDirExistFlag = false;
}
}
return isDirExistFlag;
}
}

最后调用方式如下:
@Autowired
private UpdateFileUtil sftpUtil;
/**
* 上传文件到服务器
*
* @param files 图片
* @return
*/
@PostMapping("/file")
public Result<List<String>> file(MultipartFile[] files) throws Exception {
List<String> paths = sftpUtil.uploadMultipartFilesToServer(files);
return Result.ofSuccess(paths);
}

结语
温馨提示,如果不是强制要求上传附件到远程主机,那么不建议这样使用。因为这样会使得服务器的账号密码泄露(可以创建一个访问指定文件夹的账号,用作shell 连接)。

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/23/java%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e5%88%b0%e6%8c%87%e5%ae%9a%e6%9c%8d%e5%8a%a1%e5%99%a8/

欢迎入群一起讨论

 

 

标签:java,String,sftp,host,directory,服务器,SFTP,上传,append
From: https://www.cnblogs.com/songsu/p/17782217.html

相关文章

  • 文件上传请求头设置
    文件上传请求头设置涉及到文件上传时接口需要配置请求头:headers:{‘Content-Type’:‘multipart/form-data’}例如://导入excel数据exportfunctionimportStorage(data){returnrequest({url:'/agcloud/zhps/storage/importFile',method:'p......
  • Java学习之路(二)
    Java学习之路(二)1、流程控制语句1.1、顺序结构顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。执行流程:1.2、分支结构1.2.1、if语句格式一:单分支if(关系表达式){语句体; }执行流程:①......
  • Arthas(阿尔萨斯)Java 诊断工具
    Arthas(阿尔萨斯)能为你做什么?Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:1.这个类从哪个jar包加载的?为什么会报各种类相关的Exception?2.我改的代码为什么没有执行到?难道是我没commit?分支搞错了?3.遇到问题无......
  • 一台云服务器一个域名下,如何运行多个JAVA后端项目和多个VUE前端项目
    拿若依前后端分离版项目举例:修改前端代码ruoyi-ui/vue.config.js//二级目录名称ruoyi-uipublicPath:'/ruoyi-ui/',ruoyi-ui/src/router/index.jsexportdefaultnewRouter({mode:'history',//去掉url中的#base:'/ruoyi-ui/',//二级目录路径scrollBehavior:......
  • JavaSE day02【关键字,代码块,接口,枚举】测评
    选择题题目1(单选):下列关于static关键字描述错误的是()选项:​ A.静态成员被所类的所有对象共享​ B.可以通过对象调用,也可以通过类名调用,建议使用类名​ C.每调用一次都会在内存产生一个新的对象​ D.随着类的加载而加载,优先于对象存在题目2(多选):......
  • JavaSE day02-关键字,接口,代码块,枚举
    JavaSEday02-关键字,接口,代码块,枚举1关键字2代码块3接口4枚举1Java中的关键字1.1static关键字static关键字:静态的意思,可以修饰变量,也可以修饰方法,被static修饰的成员,我们叫做静态成员static特点:静态成员被所类的所有对象共享随着类的......
  • Java 入门 01~08 & Java 基础 01~04
    Java入门01~081.java的Helloword​ 创建helloWord.java文件->Javac编译完成后->java运行在终端{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}2.语言分类​ 编译型:完整编译以后可直接执行的。......
  • 小景的工具使用--Java诊断工具Arthas的使用说明
    小景最近在做程序和数据库的压测工作,期间监控压测数据,分析程序原因变成了一个待解决的问题,根据公司小伙伴的建议,接触了阿尔萨斯这个诊断工具,下面小景分别基于Linux操作系统和Windows操作系统,来详细的说下使用说明和使用心得。 Arthas(阿尔萨斯)是一个用于诊断Java应用程序的开源......
  • 以下是中国最丰富的10个Java资源网站及网址:
    以下是中国最丰富的10个Java资源网站及网址:CSDN-https://www.csdn.net/Java中国-http://www.javachina.net/开源中国-https://www.oschina.net/博客园-https://www.cnblogs.com/码云-https://gitee.com/极客学院-https://www.jikexueyuan.com/ITeye-http://w......
  • Java XXE漏洞原理研究
    一、JavaXML解析库简介Java解析XML的四种方式1、DOM(DocumentObjectModel)解析1)优缺点优点允许应用程序对数据和结构做出更改访问是双向的,可以在任何时候再树中上、下导航获取、操作任意部分的数据缺点解析XML文档的需要加载整个文档来构造层次结构,消耗内存资源......