java使用SFTP上传文件到资源服务器
这篇文章主要介绍了java使用SFTP上传文件到资源服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下本文实例为大家分享了java实现sftp上传文件到资源服务器工具类,供大家参考,具体内容如下
首先得创建连接sftp服务器的公共类mysftp.java:
package cn.test.util;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.text.simpledateformat;
import java.util.date;
import java.util.properties;
import java.util.vector;
import javax.servlet.http.httpservletrequest;
import com.jcraft.jsch.channel;
import com.jcraft.jsch.channelsftp;
import com.jcraft.jsch.jsch;
import com.jcraft.jsch.session;
import com.jcraft.jsch.sftpexception;
public class mysftp {
/**
* 连接sftp服务器
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
*/
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) {
}
return sftp;
}
/**
* 上传文件
*
* @param directory
* 上传的目录
* @param uploadfile
* 要上传的文件
* @param sftp
*/
public void upload(string directory, string uploadfile, channelsftp sftp) {
try {
sftp.cd(directory);
file file = new file(uploadfile);
sftp.put(new fileinputstream(file), file.getname());
} catch (exception e) {
e.printstacktrace();
}
}
/**
* 下载文件
*
* @param directory
* 下载目录
* @param downloadfile
* 下载的文件
* @param savefile
* 存在本地的路径
* @param sftp
*/
public void download(string directory, string downloadfile,
string savefile, channelsftp sftp) {
try {
sftp.cd(directory);
file file = new file(savefile);
sftp.get(downloadfile, new fileoutputstream(file));
} catch (exception e) {
e.printstacktrace();
}
}
/**
* 删除文件
*
* @param directory
* 要删除文件所在目录
* @param deletefile
* 要删除的文件
* @param sftp
*/
public void delete(string directory, string deletefile, channelsftp sftp) {
try {
sftp.cd(directory);
sftp.rm(deletefile);
} catch (exception e) {
e.printstacktrace();
}
}
public void uploadsftp(httpservletrequest request,string[] uploadfiles) throws exception {
mysftp mysftp = new mysftp();
sftputil sftputil =new sftputil();
channelsftp sftp = null;
session session = null;
try {
sftp = mysftp.connect(systemconstants.sftp_host, integer.parseint(systemconstants.sftp_port), systemconstants.sftp_username, systemconstants.sftp_password);
for (int i = 0; i < uploadfiles.length; i++) {
date uploadtime = new date();
string url=request.getsession().getservletcontext().getrealpath("").replaceall("\\\\", "/");
string uploadfile =url.substring(0, url.lastindexof("/"))+uploadfiles;
// string savefile="";
simpledateformat sdf = new simpledateformat("yyyymmdd");
string ymd = sdf.format(uploadtime);
string relativepath = ymd + "/";
string directory = systemconstants.sftp_directory+ relativepath;
sftputil.createdir(directory, sftp);
mysftp.upload(directory, uploadfile, sftp);
sftp.cd(directory);
}
} catch (exception e) {
e.printstacktrace();
}finally{
try {
if(sftp != null) {
sftp.disconnect();
}
} catch (exception e) {
e.printstacktrace();
}
try {
if(session != null) {
session.disconnect();
}
} catch (exception e) {
e.printstacktrace();
}
}
}
/**
* 列出目录下的文件
*
* @param directory
* 要列出的目录
* @param sftp
* @return
* @throws sftpexception
*/
@suppresswarnings("rawtypes")
public vector listfiles(string directory, channelsftp sftp)
throws sftpexception {
return sftp.ls(directory);
}
}
上传图片时,调用sftputil类中的uploadmultipartfile方法即可。
package cn.test.util;
import java.text.simpledateformat;
import java.util.date;
import java.util.random;
import org.springframework.web.multipart.multipartfile;
import com.jcraft.jsch.channelsftp;
import com.jcraft.jsch.session;
import com.jcraft.jsch.sftpattrs;
import com.jcraft.jsch.sftpexception;
/**文件上传工具类*/
public class sftputil {
/**
* spring文件上传方法
* */
public static string uploadmultipartfile(multipartfile file,string fileext) {
sftputil sftputil =new sftputil();
string originalfilename = file.getoriginalfilename();
//生成文件名
date uploadtime = new date();
simpledateformat sdf = new simpledateformat("yyyymmdd");
string ymd = sdf.format(uploadtime);
string relativepath = ymd+"/";
simpledateformat df = new simpledateformat("yyyymmddhhmmss");
string filename = df.format(uploadtime) + "_" + new random().nextint(1000) + "." + fileext;
// string filename = string.valueof(new date().gettime())+ new random().nextint(10000)+"."+originalfilename.substring(originalfilename.lastindexof(".") + 1);
string directory=systemconstants.sftp_directory+relativepath;
channelsftp sftp =null;
session session = null;
try {
mysftp mysftp = new mysftp();
sftp = mysftp.connect(systemconstants.sftp_host, integer.parseint(systemconstants.sftp_port), systemconstants.sftp_username, systemconstants.sftp_password);
session = sftp.getsession();
sftputil.createdir(directory, sftp);
sftp.cd(directory);
sftp.put(file.getinputstream(), filename);
sftp.disconnect();
sftp.getsession().disconnect();
} catch (exception e) {
system.out.println("文件[" + originalfilename + "]上传失败,堆栈轨迹如下:");
e.printstacktrace();
}finally{
try {
if(sftp != null) {
sftp.disconnect();
}
} catch (exception e) {
e.printstacktrace();
}
try {
if(session != null) {
session.disconnect();
}
} catch (exception e) {
e.printstacktrace();
}
}
string rename=systemconstants.sftp_httpbaseurl+relativepath+filename;
return rename;
}
/**
* 创建目录
* @throws exception
*/
public void createdir(string createpath, channelsftp sftp) throws exception {
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) {
throw new exception(e.getmessage());
}
}
/**
* 判断目录是否存在
*/
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;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/feifuzeng/article/details/71159162
http://www.zzvips.com/article/172424.html
页:
[1]