java 上传文件到指定目录_Java实现上传文件到指定服务器指定目录

前言需求

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

具体实现

引入的pom

ch.ethz.ganymed

ganymed-ssh2

262

com.jcraft

jsch

0.1.55

建立实体类

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

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容器。

如果在普通类里面使用这个类,就需要看一下上篇博客了。哈哈。

总结

在我们使用的时候,主要调uploadFile这个方法即可。传递File文件,目标路径及文件名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值