1、搭建本地sftp
1.1、下载msftpsrvr.exe软件
下载地址:
1.2、双击msftpsrvr.exe,录入sftp信息
2、工具类
SftpUploadUtil
package com.hundsun.channel.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Properties;import java.util.Vector;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.jcraft.jsch.SftpException;public class SftpUploadUtil { public static final Log logger = LogFactory.getLog(SftpUploadUtil.class); /** * 连接sftp服务器 * @param host 主机 * @param port 端口 * @param username 用户名 * @param password 密码 * @param privateKey 密钥文件路径 * @param passphrase 密钥口令 * @return */ public ChannelSftp connect(String host, int port, String username,String password,String privateKey,String passphrase) { ChannelSftp sftp = null; try { JSch jsch = new JSch(); jsch.getSession(username, host, port); if (privateKey != null && !"".equals(privateKey)) { //使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥 if (passphrase != null && !"".equals(passphrase)) { jsch.addIdentity(privateKey, passphrase); } else { jsch.addIdentity(privateKey); } } Session sshSession = jsch.getSession(username, host, port); System.out.println("Session created."); if (password != null && !"".equals(password)) { sshSession.setPassword(password); } Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); sshSession.setConfig(sshConfig); sshSession.connect(); System.out.println("Session connected."); System.out.println("Opening Channel."); Channel channel = sshSession.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; System.out.println("Connected to " + host + "."); //System.out.println("登录成功"); } catch (Exception e) { System.out.println("------"); e.printStackTrace(); } return sftp; } /** * 关闭 * @param sftp * @param sshSession * @throws JSchException */ public void close(ChannelSftp sftp) throws JSchException { if (null!=sftp) { if (null!=sftp.getSession()) { sftp.getSession().disconnect(); } sftp.disconnect(); } } /** * 上传文件 * @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()); System.out.println("上传成功!"); } 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 { logger.info("下载目录:" + directory + ",下载文件:" + downloadFile + ",存本地路径:" + saveFile); 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(); } } /** * 列出目录下的文件 * @param directory 要列出的目录 * @param sftp * @return * @throws SftpException */ public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException{ return sftp.ls(directory); } /** * 创建文件夹 * @param sftp * @param directory * @throws SftpException */ public void createFolder(ChannelSftp sftp,String directory) throws SftpException { sftp.mkdir(directory); } public static void main(String[] args) { /* Vectorvector = new Vector (); String host="192.168.54.112"; int port=22; String username="wjs"; String password="wjs@567"; //上传的目录 String directory="/home/wjs/upload/1001/"+DateUtil.getDateTime("yyyyMMdd", new Date()); System.out.println("directory:--------------"+directory); //要上传的文件 String uploadFile="F:\\upload\\1001\\20151102\\info_1001_9000_20151102.txt"; SftpUploadUtil sf = new SftpUploadUtil(); //获取连接 ChannelSftp sftp = sf.connect(host, port, username, password); //创建文件夹 try { //home/wjs/upload/1001 vector = sftp.ls(directory); } catch (SftpException e) { // TODO Auto-generated catch block if (e.id == 2 || "No such file".equals(e.getMessage())) { Iterator it = vector.iterator(); while (it.hasNext()) { LsEntry lsEntry = it.next(); System.out.println(lsEntry.getLongname()); System.out.println(lsEntry.getLongname().startsWith("d")); } try { sftp.mkdir(directory); //上传文件 sf.upload(directory, uploadFile, sftp); File file = new File(uploadFile); long fileSize = file.length(); sftp.put(directory + "/info_1001_9000_20151026.txt", new FileProgressMonitor( fileSize), ChannelSftp.OVERWRITE); sftp.quit(); sf.close(sftp); } catch (SftpException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (JSchException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } */}}
3、测试连接
public static void main(String[] args) throws Exception { SftpUploadUtil sfUtil = new SftpUploadUtil(); String sftpHost = "10.23.10.39"; int sftpPort = 22; // 端口表字段暂时未定义 String sftpUserName = "quanbs"; String password = "123456"; String privateKey = ""; // 秘钥文件路径 String passphrase = ""; // 秘钥口令 ChannelSftp sftp = sfUtil.connect(sftpHost, sftpPort, sftpUserName, password, privateKey, passphrase); }
运行结果(连接成功):
4、测试sftp上传
public static void main(String[] args) throws Exception { SftpUploadUtil sfUtil = new SftpUploadUtil(); String sftpHost = "10.23.10.39"; int sftpPort = 22; // 端口表字段暂时未定义 String sftpUserName = "quanbs"; String password = "123456"; String privateKey = ""; // 秘钥文件路径 String passphrase = ""; // 秘钥口令 ChannelSftp sftp = sfUtil.connect(sftpHost, sftpPort, sftpUserName, password, privateKey, passphrase); // 测试sftp上传 testUploadFile(sfUtil, sftp); }
/** * 测试上传文件 * @param sfUtil * @param sftp * @throws SftpException */ public static void testUploadFile(SftpUploadUtil sfUtil, ChannelSftp sftp) throws SftpException{ String sftpDirectory = "E:"+File.separator+"sftp"; sftpDirectory = "\\"; String uploadFile = "D:\\log.zip"; List lsList = getLsListName(File.separator, sftp); // 获取目录下的文件名List String date = DateUtils.convertDateToLong(new Date(), "yyyyMMdd").toString(); // 当天文件夹 20161026 if (!lsList.contains(date)) // 当天日期文件夹不存在则创建 sftp.mkdir(date); sftpDirectory += date; sfUtil.upload(sftpDirectory, uploadFile, sftp); }
/** * 获取目录下的文件名List * @param path 目录 * @param sftp * @throws SftpException */ private static ListgetLsListName(String path, ChannelSftp sftp) throws SftpException{ List list = new ArrayList (); Vector vector = sftp.ls(File.separator); Iterator it = vector.iterator(); while (it.hasNext()) { LsEntry lsEntry = it.next(); list.add(lsEntry.getFilename()); } return list; }
运行结果:
附:
DateUtils
package com.hundsun.channel.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateUtils { public static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd"); public static SimpleDateFormat FORMAT_DATETIME = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static SimpleDateFormat FORMAT_DATE_SIMPLE = new SimpleDateFormat("yyyyMMdd"); public static SimpleDateFormat FORMAT_DATETIME_SIMPLE = new SimpleDateFormat("yyyyMMddHHmmss"); public static SimpleDateFormat FORMAT_DATE_CN = new SimpleDateFormat("yyyy��MM��dd��"); public static SimpleDateFormat FORMAT_DATETIME_CN = new SimpleDateFormat("yyyy��MM��dd��HHʱmm��ss��"); public static SimpleDateFormat FORMAT_DATETIME_HOUR = new SimpleDateFormat("yyyy-MM-dd HH:mm"); public static Date getDateTime(String dateStr, SimpleDateFormat format) { Date date = null; try { date = format.parse(dateStr); } catch (ParseException e) { return null; } return date; } public static String getDateTimeStr(Date date, SimpleDateFormat format) { if (date == null || format == null) { return null; } return format.format(date); } public static Date getDate(String dateStr) { if (dateStr == null || "".equals(dateStr)) { return null; } return getDateTime(dateStr, FORMAT_DATE); } public static Date getDateTime(String dateStr) { return getDateTime(dateStr, FORMAT_DATETIME); } public static String getDateStr(Date date) { return getDateTimeStr(date, FORMAT_DATE); } public static String getDateTimeStr(Date date) { return getDateTimeStr(date, FORMAT_DATETIME); } public static long getDiffDays(Date startTime, Date endTime) { long quot = 0; if (startTime == null || endTime == null) { return quot; } SimpleDateFormat ft = new SimpleDateFormat("yyyy/MM/dd"); try { Date endDate = ft.parse(ft.format(endTime)); Date startDate = ft.parse(ft.format(startTime)); quot = endDate.getTime() - startDate.getTime(); quot = quot / 1000 / 60 / 60 / 24; } catch (ParseException e) { e.printStackTrace(); } return quot; } public static Long convertDateToLong(Date date, String format) { SimpleDateFormat ft = new SimpleDateFormat(format); String formatStr = ft.format(date); long parseLong = Long.parseLong(formatStr); return parseLong; } public static Long convertDateToLong(Date date) { String formatStr = FORMAT_DATETIME_SIMPLE.format(date); long parseLong = Long.parseLong(formatStr); return parseLong; }}
待完,很粗糙的东西 ,花了10分钟整理了下,要赶最后一班地铁回家了。 又是漫长的1个半小时。。。。