当前位置: 首页 > news >正文

java项目使用jsch下载ftp文件

pom

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>

demo1:main方法直接下载

package com.example.controller;import com.jcraft.jsch.*;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;public class JSchSFTPFileTransfer {public static void main(String[] args) {String host = "10.*.*.*";//服务器地址String user = "";//用户String password = "";//密码int port = 22;//端口String remoteFilePath = "/home/*/*/ps.xlsx";//拉取文件的路径String localFilePath = "C:\\Users\\*\\Downloads\\ps.xlsx";//下载到本地路径JSch jsch = new JSch();// 初始化对象Session session = null;ChannelSftp sftpChannel = null;InputStream inputStream = null;OutputStream outputStream = null;try {// 创建会话session = jsch.getSession(user, host, port);session.setConfig("StrictHostKeyChecking", "no");session.setPassword(password);session.connect();// 打开 SFTP 通道sftpChannel = (ChannelSftp) session.openChannel("sftp");sftpChannel.connect();//创建本地路径int lastSlashIndex = remoteFilePath.lastIndexOf("/");String path = remoteFilePath.substring(0, lastSlashIndex);File file = new File(path);if (!file.exists()) {try {file.mkdirs();} catch (Exception e) {System.out.println("=====jSchSFTPFileTransfer创建文件夹失败!====");}}// 下载文件inputStream = sftpChannel.get(remoteFilePath);// 上传文件到本地outputStream = new java.io.FileOutputStream(localFilePath);byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}System.out.println("=====jSchSFTPFileTransfer文件下载成功!===="+localFilePath);} catch (JSchException | SftpException | java.io.IOException e) {e.printStackTrace();} finally {// 关闭流、通道和会话if (inputStream != null) {try {inputStream.close();} catch (java.io.IOException e) {e.printStackTrace();}}if (outputStream != null) {try {outputStream.close();} catch (java.io.IOException e) {e.printStackTrace();}}if (sftpChannel != null && sftpChannel.isConnected()) {sftpChannel.disconnect();}if (session != null && session.isConnected()) {session.disconnect();}}}
}

demo2:页面按钮调接口下载

后端
package com.example.controller;import com.example.common.utils.SFTPUtil;
import com.jcraft.jsch.SftpException;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class testController {@GetMapping(value = "/export")public ResponseEntity<byte[]> empController(String remotePath) throws Exception {
//        remotePath = "/home/fr/zycpzb/ps.xlsx";String host = "10.1.16.92";int port = 22;String userName = "fr";String password = "Lnbi#0Fr";SFTPUtil sftp = new SFTPUtil(userName, password, host, port);sftp.login();try {byte[] buff = sftp.download(remotePath);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData("attachment", "ps.xlsx");return ResponseEntity.ok().headers(headers).body(buff);} catch (SftpException e) {e.printStackTrace();return ResponseEntity.status(500).body(null);}finally {sftp.logout();}}
}

SFTPUtil

package com.example.common.utils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import com.jcraft.jsch.*;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**** @ClassName: SFTPUtil* @Description: sftp连接工具类* @version 1.0.0*/
public class SFTPUtil {private transient Logger log = LoggerFactory.getLogger(this.getClass());private ChannelSftp sftp;private Session session;/*** FTP 登录用户名*/private String username;/*** FTP 登录密码*/private String password;/*** 私钥*/private String privateKey;/*** FTP 服务器地址IP地址*/private String host;/*** FTP 端口*/private int port;/*** 构造基于密码认证的sftp对象** @param username* @param password* @param host* @param port*/public SFTPUtil(String username, String password, String host, int port) {this.username = username;this.password = password;this.host = host;this.port = port;}/*** 构造基于秘钥认证的sftp对象** @param username* @param host* @param port* @param privateKey*/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服务器** @throws Exception*/public void login() {try {JSch jsch = new JSch();if (privateKey != null) {jsch.addIdentity(privateKey);// 设置私钥log.info("sftp connect,path of private key file:{}", privateKey);}log.info("sftp connect by host:{} username:{}", host, username);session = jsch.getSession(username, host, port);log.info("Session is build");if (password != null) {session.setPassword(password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();log.info("Session is connected");Channel channel = session.openChannel("sftp");channel.connect();log.info("channel is connected");sftp = (ChannelSftp) channel;log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));} catch (JSchException e) {log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()});}}/*** 关闭连接 server*/public void logout() {if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();log.info("sftp is closed already");}}if (session != null) {if (session.isConnected()) {session.disconnect();log.info("sshSession is closed already");}}}/*** 下载文件** @param directory*            下载目录* @param downloadFile*            下载的文件* @param saveFile*            存在本地的路径* @throws SftpException* @throws FileNotFoundException* @throws Exception*/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));log.info("file:{} is download successful" , downloadFile);}/*** 下载文件* @param directory 下载目录* @param downloadFile 下载的文件名* @return 字节数组* @throws SftpException* @throws IOException* @throws Exception*/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);log.info("file:{} is download successful" , downloadFile);return fileData;}/*** 下载文件* @param directory 下载的文件名* @return 字节数组* @throws SftpException* @throws IOException* @throws Exception*/public byte[] download(String directory) throws SftpException, IOException{InputStream is = sftp.get(directory);byte[] fileData = IOUtils.toByteArray(is);log.info("file:{} is download successful" , directory);is.close();return fileData;}
}
前端jQuery
function downloadFile(filePath) {$.ajax({url: '/download',type: 'GET',data: { filePath: filePath },xhrFields: {responseType: 'blob'  // Important to handle binary data},success: function(data, status, xhr) {// Create a download link for the blob datavar blob = new Blob([data], { type: xhr.getResponseHeader('Content-Type') });var link = document.createElement('a');link.href = window.URL.createObjectURL(blob);link.download = 'filename.ext'; // You can set the default file name heredocument.body.appendChild(link);link.click();document.body.removeChild(link);},error: function(xhr, status, error) {console.error('File download failed:', status, error);}});
}

相关文章:

java项目使用jsch下载ftp文件

pom <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>demo1&#xff1a;main方法直接下载 package com.example.controller;import com.jcraft.jsch.*; im…...

指针(初阶1)

一.指针是什么 通俗的讲&#xff0c;指针就是地址&#xff0c;其存在的意义就像宾馆房间的序号一样是为了更好的管理空间。 如下图&#xff1a; 如上图所示&#xff0c;指针就是指向内存中的一块空间&#xff0c;也就相当于地址 二.一个指针的大小是多少 之前我们学习过&#x…...

MySQL实体类框架

实现mysql数据库的增删改查功能 import com.mchange.v2.collection.MapEntry; import lombok.Data; import org.junit.jupiter.api.Test;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.*; import java.sql.*; …...

数据结构之初始泛型

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 深入了解包装类 包装类的由来 装箱与拆箱 面试题 泛型 泛型的语法与使用…...

【网络编程开发】7.TCP可靠传输的原理

7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;即传输控制协议&#xff0c;是网络通信中的一种重要协议&#xff0…...

视觉SLAM十四讲:从理论到实践(Chapter8:视觉里程计2)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解光流法跟踪特征点的原理。 2.理解直接法是如何估计相机位姿的。 3.实现多层直接法的计算。 特征点法存在缺陷&#xff1a; 二、光流(Optical Flow) …...

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…...

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…...

Chrome DevTools解密:成为前端调试大师的终极攻略

Chrome DevTools是一套内置于Google Chrome浏览器中的开发者工具&#xff0c;它允许开发者对网页进行调试、分析和优化。本文将全面介绍DevTools的功能、使用方法以及注意事项&#xff0c;帮助开发者更好地利用这些工具来提升开发效率和网页性能。 一、简介 1. DevTools是什么…...

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…...

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中&#xff0c;企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力&#xff0c;成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人&#xff0c;并强调其功能体…...

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…...

信息系统项目管理师0148:输出(9项目范围管理—9.3规划范围管理—9.3.3输出)

点击查看专栏目录 文章目录 9.3.3 输出 9.3.3 输出 范围管理计划 范围管理计划是项目管理计划的组成部分&#xff0c;描述将如何定义、制定、监督、控制和确认项 目范围。范围管理计划用于指导如下过程和相关工作&#xff1a; ①制定项目范围说明书&#xff1b;②根据详细项目范…...

解决 SQLyog 连接 MySQL 8 连不上和 SQLyog Trial 试用到期的问题

今天发现 SQLyog 突然连不上 MySQL 了&#xff0c;跟之前不一样的地方就是我升级了 MySQL&#xff0c;升级到了 MySQL 8。 原来是因为 MySQL 8 引入了新的密码验证机制。在 MySQL 8 中默认的密码验证插件从 mysql_native_password 更换为 caching_sha2_password。我的 SQLYog …...

go语言内置预编译 //go:embed xxx 使用详解

在go语言里面&#xff0c;我们可以使用一个“类注释”的语法来来让编译器帮助我们在编译的时候将一些文件或者目录读取到指定的变量中来供我们使用。 go:embed语法&#xff1a; //go:embed 文件或者目录路径 var 变量名 变量类型 说明&#xff1a; 文件或者目录路径 可以…...

数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法

频繁项集、闭项集和关联规则 频繁项集&#xff1a;出现的次数超过最小支持度计数阈值 闭频繁项集&#xff1a;一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…...

Locust:用Python编写可扩展的负载测试

Locust&#xff1a;简化性能测试&#xff0c;让负载模拟更直观- 精选真开源&#xff0c;释放新价值。 概览 Locust是一个开源的性能和负载测试工具&#xff0c;专门用于HTTP和其他协议的测试。它采用开发者友好的方法&#xff0c;允许用户使用普通的Python代码来定义测试场景。…...

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…...

探索智慧林业系统的总体架构与应用

背景&#xff1a; 随着人们对森林资源保护和管理的重视&#xff0c;智慧林业系统作为一种新兴的林业管理手段&#xff0c;正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用&#xff0c;将现代信息技术与林业管理相结合&#xff0c;为森林资源的保护、管理和利用…...

【JSP】如何在IDEA上部署JSP WEB开发项目

以我的课设为例&#xff0c;教大家拿到他人的项目后&#xff0c;如何在IDEA上部署。 需要准备&#xff1a; JDK17&#xff08;或者JDK13&#xff09;IntelliJ IDEA 2023.2.6MySQL 8.0Tomcat 9.0 一&#xff0c;新建项目添加文件 1.1复制“位置”的路径 1.2找到该文件夹 1.3…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...