Ftp 下载文件夹

article/2025/10/12 20:40:47

今天给大家分享一下使用Ftp 下载文件夹

首先说一下 流程, 我们需要用java代码先将我们需要下载的文件夹压缩成一个zip文件 然后我们在用户下载文件的方法 去下载这个zip 就可以

第一步 我们需要导入两个包

        <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency>

第二步 我们需要创建两个工具类 JSCHUtil


/*** @author Xiaoliu* @date 2019/5/8* @description xhell 命令工具类*/import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;import java.io.InputStream;
import java.util.Properties;public class JSCHUtil {private static JSCHUtil instance;private JSCHUtil() {}public static JSCHUtil getInstance() {if (instance == null) {instance = new JSCHUtil();}return instance;}private Session getSession(String host, int port, String userName) throws JSchException {JSch jSch = new JSch();Session session = jSch.getSession(userName, host, port);return session;}public Session connect(String host, int port, String ueseName,String password) throws Exception {Session session = getSession(host, port, ueseName);session.setPassword(password);Properties config = new Properties();config.setProperty("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();return session;}public String execCmd(Session session, String command)throws Exception {if (session == null) {throw new RuntimeException("Session is null!");}ChannelExec exec = (ChannelExec) session.openChannel("exec");InputStream in = exec.getInputStream();byte[] b = new byte[1024];exec.setCommand(command);exec.connect();StringBuffer buffer = new StringBuffer();while (in.read(b) > 0) {buffer.append(new String(b));}exec.disconnect();return buffer.toString();}public static void clear(Session session) {if ((session != null) && session.isConnected()) {session.disconnect();session = null;}}
}

测试一下能用不

 public static void main(String[] args) throws Exception {Session session = JSCHUtil.getInstance().connect("192.168.108.246", 22, "root", "hadoop");String cmd = "ls /home";String result = JSCHUtil.getInstance().execCmd(session, cmd);// ???????;??System.out.println(result);System.exit(0);}

在这里插入图片描述
在这里插入图片描述

现在说明我们已经可以用我们的Java 去执行我们linux 命令了

下面我们就需要去 压缩你想要的文件了 然后去下载

创建工具方法

/*** ftp 下载文件夹** @param url        服务ip* @param port       端口号* @param username   用户名* @param password   密码* @param remotePath 服务器相对路径* @param fileName   文件名称* @return byte* @throws Exception*/public static byte[] downDirectory(String url, int port, String username, String password, String remotePath, String fileName) throws Exception {// 用于接口文件流ByteArrayOutputStream byteStream = new ByteArrayOutputStream();// 创建盒子FTPClient ftp = new FTPClient();try {int reply;// 打开盒子大门ftp.connect(url, port);// 登录ftp.login(username, password);// 获取连接返回值reply = ftp.getReplyCode();// 返回 500 ,530 都是失败if (!FTPReply.isPositiveCompletion(reply)) {ftp.disconnect();return byteStream.toByteArray();}// 设置字符集ftp.setControlEncoding("UTF-8");ftp.setFileType(FTPClient.BINARY_FILE_TYPE);ftp.enterLocalPassiveMode();// 转移到FTP服务器目录ftp.changeWorkingDirectory(remotePath);// 发送 Linux xhell 命令Session session = JSCHUtil.getInstance().connect("192.168.108.246", 22, "root", "hadoop");// 命令String cmd = "zip -r /home/ftp_shypt/shypt/yl_merchant_images/images.zip /home/ftp_shypt/shypt/yl_merchant_images";// 因为我的用户的权限不够 下载文件夹  所以我需要在变更一下文件权限String result = JSCHUtil.getInstance().execCmd(session, cmd);String cmd1 = "chown -R ftp_shypt:ftp_shypt /home/ftp_shypt/shypt/yl_merchant_images/images.zip";String result1 = JSCHUtil.getInstance().execCmd(session, cmd1);JSCHUtil.clear(session);System.out.println(result);ftp.setControlEncoding("UTF-8");ftp.setFileType(FTPClient.BINARY_FILE_TYPE);ftp.enterLocalPassiveMode();// 转移到FTP服务器目录ftp.changeWorkingDirectory(remotePath);// 获取path下的所有文件String[] fs = ftp.listNames();for (String ff : fs) {String ftpName = ff;if (ftpName.equals(fileName)) {try (InputStream is = ftp.retrieveFileStream(new String(ftpName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1))) {byte[] buffer = new byte[BUFFER_SIZE];int len = -1;while ((len = is.read(buffer, 0, BUFFER_SIZE)) != -1) {byteStream.write(buffer, 0, len);}} catch (Exception e) {e.printStackTrace();}break;}}} catch (IOException e) {e.printStackTrace();} finally {if (ftp.isConnected()) {ftp.disconnect();}}return byteStream.toByteArray();}

写个测试方法 测试一下

 public static void main(String[] args) throws Exception {byte[] data = downDirectory("192.168.108.246", 21, "ftp_shypt", "ftp_shypt", "shypt/yl_merchant_images", "images.zip");File file = new File("E:\\images.zip");FileOutputStream fileOutputStream = new FileOutputStream(file);fileOutputStream.write(data);}

在这里插入图片描述
在这里插入图片描述

注意我是直接将他下载到我本机了 你可以获取byte[] 流 用 HttpServletResponse response 将流 写出成一个文件zip 就完成浏览器下载

public void downDirectory(HttpServletResponse response) throws IOException, JSchException {System.out.println("初始化成功");try {byte[] data = downDirectory(URL, PORT, USERNAME, PASSWD, PATH,"images.zip");response.addHeader("Content-Disposition", "attachment;filename= " + "images.zip");response.setContentType("application/vnd.ms-excel;charset=utf-8");ServletOutputStream out = response.getOutputStream();out.write(data);} catch (Exception e) {e.printStackTrace();}}

完事了 请你试一试 有什么问题 @我 Win 564580134 著名你是干啥的


http://chatgpt.dhexx.cn/article/VdRf4s6p.shtml

相关文章

web下载文件夹

1、文件下载有两种方式&#xff1a;一种是超链接&#xff0c;一种是Servlet提供下载。 2、超链接下载时&#xff1a;当文件可以在网页直接打开时&#xff0c;会直接打开文件&#xff0c;而不是下载&#xff0c;当文件打开不了时&#xff0c;会提供下载窗口。 3、超链接下载原…

List数组转换JSON格式

最近在写java&#xff0c;然后leader需要几个接口&#xff0c;里面的东西就是json格式。然后需求明白后&#xff0c;想了想思路:先把需要的东西从库里拿出来放到一个数组里面&#xff0c;然后再将数组转换成json&#xff0c;大体思路确定后&#xff0c;开始敲代码。 首先List一…

java中map、list转json

1、需导入的jar包 commons-beanutils-1.8.0.jar commons-collections-3.2.1.jar commons-lang-2.6.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar json-lig-2.4-jdk15.jar xom-1.2.6.jar 可自行网上下载 2、 3.List转成json格式 3、map转json 4、 参考&#xff…

Fastjson实用工具类,List转JSONString,List转JSONArray,JSONArray转List,JSONArray转ArrayList,JSONObject转HashMap

Fastjson实用工具类&#xff0c;List转JSONString&#xff0c;List转JSONArray&#xff0c;JSONArray转List&#xff0c;JSONArray转ArrayList&#xff0c;JSONObject转HashMap 问题背景Fastjson转换心得Lyric&#xff1a;我们拥有 问题背景 因为经常用到fastjson&#xff0c;…

java中好用的list转json的工具hutool

java中好用的list转json的工具hutool 最近做服务器接口开发的时候遇到的小问题&#xff0c;数据库查询之后的数据怎样快捷的转化为json数据&#xff0c;第一时间想到了查库 查了挺久的&#xff0c;好多都是用代码实现&#xff0c;比较懒&#xff0c;这方面内容代码实现的偏多…

list转json

Struts2中list转换为json jar包下载地址 所需jar包&#xff0c;如下图&#xff1a; 实现代码&#xff0c;这里以execute方法为例&#xff1a; Overridepublic String execute() throws Exception {//1.调用Service根据typecode获得数据字典对象listList<BaseDict> l…

json与对象互转:json转实体类、实体类转json、json转List、List转json

目录 使用fastjson和Gson实现&#xff1a;实体类与json互转&#xff0c;List与json互转1. 实体类转json数据1.1 fastjson:1.2 Gson&#xff1a; 2. json转实体类2.1 fastjson&#xff1a;2.2 Gson: 3. List集合转json3.1 fastjson:3.2 Gson&#xff1a; 4. JSON转List集合4.1 f…

方法重写与重载的区别

1、方法重载 重载&#xff08;Overload&#xff09; 是在一个类里面&#xff0c;但方法的参数不同&#xff0c;包括参数的类型或者个数&#xff0c;返回值的类型可相同可不同。每一个重载的方法都有一个独一无二的参数列表。 最常用的地方就是构造器的重载。 2.方法重写 重写…

C#重写和重载的区别分析

一、前言 接触面向对象的思想已经有一段时光了&#xff0c;为什么要学习面向对象呢&#xff1f;因为面向对象具有可复用性、可维护性、可扩展性等优点。 刚学习完C#之后&#xff0c;难免会对重载和重写傻傻分不清楚。如今通过查阅资料对这两者有了一个大概的理解&#x…

【Java SE】重写和重载的区别

重写: 重写&#xff08;Override&#xff09;是父类与子类之间多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数&#xff0c;我们说该方法被重写 (Override)。子类的对象使用这个方法时&#xff0c;将调用子类中的定义&#xff0c;对它而言&#xff0c;父…

方法重写和重载的区别

一、方法重写(0veriding) 在Java程序中&#xff0c;类的继承关系可以产生一个子类&#xff0c;子类继承父类&#xff0c;它具备了父类所有的特征&#xff0c;继承了父类所有的方法和变量。 子类可以定义新的特征&#xff0c;当子类需要修改父类的一些方法进行扩展&#xff0c…

面试官:Java的重写和重载有什么区别?

老读者都知道了&#xff0c;七年前&#xff0c;我从美女很多的苏州回到美女更多的洛阳&#xff08;美化了&#xff09;&#xff0c;抱着一幅“从二线城市退居三线城市”的心态&#xff0c;投了不少简历&#xff0c;也“约谈”了不少面试官&#xff0c;但仅有两三个令我感到满意…

JAVA重写和重载的区别

文章目录 [toc] 问&#xff1a; Java 重载与重写是什么&#xff1f;有什么区别&#xff1f;问&#xff1a;Java 构造方法能否被重写和重载&#xff1f;问&#xff1a;下面程序的运行结果是什么&#xff0c;为什么&#xff1f; 问&#xff1a; Java 重载与重写是什么&#xff1f…

matlab 中histogram,hist的用法

x randn(1000,1); edges [-10 -2:0.25:2 10]; h histogram(x,edges);这是指定区间的&#xff1b;第一个是-10&#xff0c;2 histogram参考链接 hist是用区间的作为直方图的中心 hist参考链接

文献引文分析利器HistCite使用教程(附精简易用免安装Pro版本下载)

如果你选修过中国科学技术大学罗昭锋老师的《文献管理与信息分析》&#xff0c;那么你一定不会对HistCite 感到陌生&#xff0c;这是一款非常强大的引文分析工具&#xff0c;可以快速绘制出某个研究领域的发展脉络&#xff0c;快速锁定某个研究方向的重要文献和学术大牛&#x…

文献综述搜索利器——HistCite

HistCite 1. LCR2. GCS3. LCS4. CR5. 说明6. 参考 1. LCR Local Cited References is the number of references citing local papers. By clicking on “LCR”,you can sort the collection by this score. By clicking on the LCR number, you can see a list of thepapers …

2021-01-19(学堂云)文献管理与信息分析期末考卷

&#xff08;学堂云&#xff09;文献管理与信息分析期末考卷 1为知笔记中群组的核心功能是?2以下哪种软件可以帮我们追踪到最新资讯?3连接goole的时候&#xff0c;输入http://google.com,网页会自动跳到http://google .com.hk,解决方案是在htttp://google.com后面输入哪三个…

引文分析软件histcite简介

本文写于多年之前。附上能个近期学生写的补充&#xff0c;以及改进版的小程序。 https://zhuanlan.zhihu.com/p/20902898 这是上学期选修我课程的王庆撰写文件&#xff0c;并改写了一下程序&#xff0c;导入更加方便。 附王庆改写的程序下载链接&#xff1a;http://pan.baidu…

HistCite软件导入文献

转自&#xff1a;了凡春秋 上一篇博客介绍了HistCite软件的一些情况和使用中的一个问题的解决方法。这篇说一下这个软件的使用方法吧&#xff0c;其实最关键的就是导入文献&#xff0c;剩下的就是各种排序查看、产生引用关系图锁定重要文献。 HistCite导入的文献必须来自于WoK数…