Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载
一、Java实现对SFTP服务器的文件的上传下载:
1、添加maven依赖:
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version>
</dependency>
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和FTP两种连接服务器的方式实现对文件的上传下载相关推荐
- 使用java对ftp进行文件的上传下载demo
本文引用了https://www.cnblogs.com/lr393993507/p/5502266.html资源,并做了一些优化 这里有个写好的java项目demo,csdn好像擅自给我的资源加了很 ...
- FTP客户端--实现FTP文件的上传下载功能
现在是2017.6.16的1点多,这几天刚好做了个FTP客户端的计网实验,就把思路过程和源码发上来吧! 一.设计思路:首先,登陆指定的FTP服务器(指定服务器的IP和用户名,密码,端口号若无就默认为2 ...
- java 文件下载 组件_java文件夹上传下载组件
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. *如何分片: *如何合成一个文件: *中断了从哪个分片开始. ...
- 远程连接Linux服务器并实现文件的上传下载
我看网上关于远程服务器的文件上传下载教程都非常简洁~但是大多数漏掉了一些处理上的细节,这里进行一个稍微详细一点的总结. 远程连接服务器 在本机的cmd或本地Linux系统下,使用如下ssh命令进行连接 ...
- FTP 两种连接模式
简介 FTP协议要用到两个TCP连接, 一个是命令连接,用来在FTP客户端与服务器之间传递命令:另一个是数据连接,用来上传或下载数据.通常21端口是命令端口,20端口是数据端口.当混入主动/被动模式的 ...
- Java连接FTP服务器并且实现对其文件的上传和下载
概述 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".FTP作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.F ...
- webstorm两个文件比对_webstorm/phpstorm配置连接ftp快速进行文件比较(上传下载/同步)操作...
这些功能是平常IDE,FTP软件中少见的,而且是很耗工作时间的一个操作.换句话说,在Webstorm/Phpstorm中操作ftp能找到原来版本控制的感觉.唯一的缺点是:上传,下载的打开链接要稍费时间 ...
- 平安金管家显示连接服务器失败,平安金管家平安run上传步数失败请更换原设备手机详细解决教程...
从2020年9月25号开始,金管家一次大更把平安RUN的部分漏洞给修复了!具体修复以下漏洞. 1.更换设备也可以上传步数: 2.时间不准确时也可以上传步数: 3.越狱及ROOT手机也可以上传步数: 4 ...
- Java实现FTP批量大文件上传下载
用Java实现FTP批量大文件上传下载 <iframe id="I0_1416224567509" style="margin: 0px; padding: 0px ...
最新文章
- 通过conda命令卸载已安装的各种包
- 企业级的开发组件02 - DevExpress DXperience Universal 2011.2.5 Final
- Cocos2dx利用intersectsRect函数检测碰撞
- 学校为什么要单位接收函_学校为什么要做校园文化建设?
- [vue] vue的:class和:style有几种表示方式?
- 2008年度一个下岗程序员的真实经历
- pyqt界面屏幕分辨率自适应_在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
- abi-api, arm target triplet https://en.wikipedia.org/wiki/ARM_architecture
- APP UI自动化测试:框架选择、环境搭建、脚本编写……全总结
- 【HDOJ 3790】最短路径问题,Dijkstra最短路,双边权
- 【5分钟 Paper】(TD3) Addressing Function Approximation Error in Actor-Critic Methods
- 算法第四版_第二章_练习题_2.1.1~2.1.12
- Windows 程序设计应用开发(上部)
- 为什么在计算机里打开U盘会闪退,U盘闪退怎么办?
- Memory stream is not expandable
- win10计算机管理权限,win10如何获取管理员权限?win10获取最高权限的方法
- LX4056耐高压线性锂电池充电IC(耐压30V,带OVP,带NTC)
- BNB、HT、OKB全面估值分析——平台币还能涨多少倍?
- HBuilderX网站打包APP
- Unity模型制作导出规范
热门文章
- 计算机设计学校,计算机设计制作大赛
- c语言的程序框图怎么写,C语言课程设计————写下流程图! 谢谢
- 直播丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
- 又是Dropout两次!这次它做到了有监督任务的SOTA
- 2020年度“CCF-百度松果基金”评审结果公示
- 本周值得读的15篇AI论文,还有源码搭配服用
- pytorch拼接函数:torch.stack()和torch.cat()--详解及例子
- ACM-ICPC 2018 焦作赛区网络预赛
- python 2x与python 3x是否兼容_使.next()与Python2和3兼容
- python读取只读word只读_Python用于NLP :处理文本和PDF文件