一、Java实现对SFTP服务器的文件的上传下载:

1、添加maven依赖:

com.jcraft

jsch

0.1.54

2、SFTPUtil工具类:

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import java.util.Properties;

import java.util.Vector;

import org.apache.commons.io.IOUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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;

/**

* 类说明 sftp工具类

*/

public class SFTPUtil {

private transient Logger log = LoggerFactory.getLogger(this.getClass());

private ChannelSftp sftp;

private Session session;

/** SFTP 登录用户名*/

private String username;

/** SFTP 登录密码*/

private String password;

/** 私钥 */

private String privateKey;

/** SFTP 服务器地址IP地址*/

private String host;

/** SFTP 端口*/

private int port;

/**

* 构造基于密码认证的sftp对象

*/

public SFTPUtil(String username, String password, String host, int port) {

this.username = username;

this.password = password;

this.host = host;

this.port = port;

}

/**

* 构造基于秘钥认证的sftp对象

*/

public SFTPUtil(String username, String host, int port, String privateKey) {

this.username = username;

this.host = host;

this.port = port;

this.privateKey = privateKey;

}

public SFTPUtil(){}

/**

* 连接sftp服务器

*/

public void login(){

try {

JSch jsch = new JSch();

if (privateKey != null) {

jsch.addIdentity(privateKey);// 设置私钥

}

session = jsch.getSession(username, host, port);

if (password != null) {

session.setPassword(password);

}

Properties config = new Properties();

config.put("StrictHostKeyChecking", "no");

session.setConfig(config);

session.connect();

Channel channel = session.openChannel("sftp");

channel.connect();

sftp = (ChannelSftp) channel;

} catch (JSchException e) {

e.printStackTrace();

}

}

/**

* 关闭连接 server

*/

public void logout(){

if (sftp != null) {

if (sftp.isConnected()) {

sftp.disconnect();

}

}

if (session != null) {

if (session.isConnected()) {

session.disconnect();

}

}

}

/**

* 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory

* @param basePath 服务器的基础路径

* @param directory 上传到该目录

* @param sftpFileName sftp端文件名

* @param in 输入流

*/

public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{

try {

sftp.cd(basePath);

sftp.cd(directory);

} catch (SftpException e) {

//目录不存在,则创建文件夹

String [] dirs=directory.split("/");

String tempPath=basePath;

for(String dir:dirs){

if(null== dir || "".equals(dir)) continue;

tempPath+="/"+dir;

try{

sftp.cd(tempPath);

}catch(SftpException ex){

sftp.mkdir(tempPath);

sftp.cd(tempPath);

}

}

}

sftp.put(input, sftpFileName); //上传文件

}

/**

* 下载文件。

* @param directory 下载目录

* @param downloadFile 下载的文件

* @param saveFile 存在本地的路径

*/

public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{

if (directory != null && !"".equals(directory)) {

sftp.cd(directory);

}

File file = new File(saveFile);

sftp.get(downloadFile, new FileOutputStream(file));

}

/**

* 下载文件

* @param directory 下载目录

* @param downloadFile 下载的文件名

* @return 字节数组

*/

public byte[] download(String directory, String downloadFile) throws SftpException, IOException{

if (directory != null && !"".equals(directory)) {

sftp.cd(directory);

}

InputStream is = sftp.get(downloadFile);

byte[] fileData = IOUtils.toByteArray(is);

return fileData;

}

/**

* 删除文件

* @param directory 要删除文件所在目录

* @param deleteFile 要删除的文件

*/

public void delete(String directory, String deleteFile) throws SftpException{

sftp.cd(directory);

sftp.rm(deleteFile);

}

/**

* 列出目录下的文件

* @param directory 要列出的目录

* @param sftp

*/

public Vector> listFiles(String directory) throws SftpException {

return sftp.ls(directory);

}

//上传文件测试

public static void main(String[] args) throws SftpException, IOException {

SFTPUtil sftp = new SFTPUtil("用户名", "密码", "ip地址", 22);

sftp.login();

File file = new File("D:\\图片\\t0124dd095ceb042322.jpg");

InputStream is = new FileInputStream(file);

sftp.upload("基础路径","文件路径", "test_sftp.jpg", is);

sftp.logout();

}

}

二、Java实现对FTP服务器的文件的上传下载

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;

/**

* ftp上传下载工具类

*/

public class FtpUtil {

/**

* Description: 向FTP服务器上传文件

* @param host FTP服务器hostname

* @param port FTP服务器端口

* @param username FTP登录账号

* @param password FTP登录密码

* @param basePath FTP服务器基础目录

* @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath

* @param filename 上传到FTP服务器上的文件名

* @param input 输入流

* @return 成功返回true,否则返回false

*/

public static boolean uploadFile(String host, int port, String username, String password, String basePath,

String filePath, String filename, InputStream input) {

boolean result = false;

FTPClient ftp = new FTPClient();

try {

int reply;

ftp.connect(host, port);// 连接FTP服务器

// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器

ftp.login(username, password);// 登录

reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

ftp.disconnect();

return result;

}

//切换到上传目录

if (!ftp.changeWorkingDirectory(basePath+filePath)) {

//如果目录不存在创建目录

String[] dirs = filePath.split("/");

String tempPath = basePath;

for (String dir : dirs) {

if (null == dir || "".equals(dir)) continue;

tempPath += "/" + dir;

if (!ftp.changeWorkingDirectory(tempPath)) { //进不去目录,说明该目录不存在

if (!ftp.makeDirectory(tempPath)) { //创建目录

//如果创建文件目录失败,则返回

System.out.println("创建文件目录"+tempPath+"失败");

return result;

} else {

//目录存在,则直接进入该目录

ftp.changeWorkingDirectory(tempPath);

}

}

}

}

//设置上传文件的类型为二进制类型

ftp.setFileType(FTP.BINARY_FILE_TYPE);

//上传文件

if (!ftp.storeFile(filename, input)) {

return result;

}

input.close();

ftp.logout();

result = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

if (ftp.isConnected()) {

try {

ftp.disconnect();

} catch (IOException ioe) {

}

}

}

return result;

}

/**

* Description: 从FTP服务器下载文件

* @param host FTP服务器hostname

* @param port FTP服务器端口

* @param username FTP登录账号

* @param password FTP登录密码

* @param remotePath FTP服务器上的相对路径

* @param fileName 要下载的文件名

* @param localPath 下载后保存到本地的路径

* @return

*/

public static boolean downloadFile(String host, int port, String username, String password, String remotePath,

String fileName, String localPath) {

boolean result = false;

FTPClient ftp = new FTPClient();

try {

int reply;

ftp.connect(host, port);

// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器

ftp.login(username, password);// 登录

reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

ftp.disconnect();

return result;

}

ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录

FTPFile[] fs = ftp.listFiles();

for (FTPFile ff : fs) {

if (ff.getName().equals(fileName)) {

File localFile = new File(localPath + "/" + ff.getName());

OutputStream is = new FileOutputStream(localFile);

ftp.retrieveFile(ff.getName(), is);

is.close();

}

}

ftp.logout();

result = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

if (ftp.isConnected()) {

try {

ftp.disconnect();

} catch (IOException ioe) {

}

}

}

return result;

}

//ftp上传文件测试main函数

public static void main(String[] args) {

try {

FileInputStream in=new FileInputStream(new File("D:\\Tomcat 5.5\\pictures\\t0176ee418172932841.jpg"));

boolean flag = uploadFile("192.168.111.128", 21, "用户名", "密码", "/www/images","/2017/11/19", "hello.jpg", in);

System.out.println(flag);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

}

java连接sftp的几种方式_Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载...相关推荐

  1. Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载

    一.Java实现对SFTP服务器的文件的上传下载: 1.添加maven依赖: <dependency><groupId>com.jcraft</groupId>&l ...

  2. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  3. 远程连接Linux服务器并实现文件的上传下载

    我看网上关于远程服务器的文件上传下载教程都非常简洁~但是大多数漏掉了一些处理上的细节,这里进行一个稍微详细一点的总结. 远程连接服务器 在本机的cmd或本地Linux系统下,使用如下ssh命令进行连接 ...

  4. 使用java对ftp进行文件的上传下载demo

    本文引用了https://www.cnblogs.com/lr393993507/p/5502266.html资源,并做了一些优化 这里有个写好的java项目demo,csdn好像擅自给我的资源加了很 ...

  5. java中两种遍历集合的方式_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  6. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别

    对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...

  7. Java连接FTP服务器并且实现对其文件的上传和下载

    概述 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".FTP作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.F ...

  8. webstorm两个文件比对_webstorm/phpstorm配置连接ftp快速进行文件比较(上传下载/同步)操作...

    这些功能是平常IDE,FTP软件中少见的,而且是很耗工作时间的一个操作.换句话说,在Webstorm/Phpstorm中操作ftp能找到原来版本控制的感觉.唯一的缺点是:上传,下载的打开链接要稍费时间 ...

  9. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?

    *** 一.创建线程 1.继承Thread类 定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中 创建该类对象, 调用start()方法就可以开启一条新线程, 新 ...

  10. java 文件下载 组件_java文件夹上传下载组件

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. *如何分片: *如何合成一个文件: *中断了从哪个分片开始. ...

最新文章

  1. 【Win10 应用开发】语音命令与App Service集成
  2. 并发 线程交替执行_并发与并行的区别
  3. 再见面试官:你能说说 Spring 框架中 Bean 的生命周期吗?
  4. C语言0xc0000142错误,第一次用c++编译器出现奇怪的报错
  5. Grid布局和Flex布局
  6. Tachyon更名为 Alluxio,并发布1.0版本
  7. Assembly Manifest 通俗简易手册
  8. Git学习笔记(九) 历史穿梭
  9. 【3D制图软件●13.4.059中文破解版】一款强大的CAD软件
  10. 怎么给批处理(bat)添加注释
  11. 深度学习常用显卡比较
  12. 23位子网掩码是多少_子网掩码23位的是多少
  13. html中表格行删除的方法,HTML删除表格行中的空格
  14. Spring及Springboot IOC与AOP思考
  15. s7填表指令att_S7-200PLC 表操作指令
  16. svn + 百度云同步盘
  17. C语言实现乘法口诀表
  18. https://www.cnblogs.com/dennytao/p/5351868.html 多个界面公用socket
  19. Android开发笔记(五十九)巧用传感器
  20. PS-点击选中某一个图层

热门文章

  1. Ubuntu IP系统配置文件使用命令设置地址
  2. delphi memo 查找字符 下行插入_VBA实践+用编程代码为PDF文档插入书签
  3. 线材下料优化python算法_深度学习中的优化算法(Optimizer)理解与python实现
  4. 两个矩阵是否相交的算法_个性化推荐召回算法——Personal Rank
  5. VF 动态规划系列dp入门
  6. linux gdb 执行命令,Linux中gdb命令起什么作用呢?
  7. 信用评分-(scorecard)记分卡开发流程,详细介绍分数校准原理calibration
  8. 机器人学(机构学)笔记
  9. Qt:多线程--子线程间通讯
  10. MacOS ClashX 配置代理端口为0问题7890 配置iterm2终端代理