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

网友投稿 552 2022-12-09


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 pWyHJuriBHassWord;

}

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) {

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于synchronized修饰静态和非静态方法
下一篇:Apache CXF如何把wsdl生成java代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~