Java从FTP下载文件到本地前端+后端

2023-11-16

一、前端

  1. 1.首先创建下载文件按钮
<template slot-scope="scope">
  <div class="Style_center">
     <el-button @click="downloadFile(scope.row)" type="text" >下载文件</el-button>
  </div>
</template>
  1. 2.其次编写手动触发事件
downloadFile(row){
   this.axios.post("/Zlhzjbxxb/downloadFile", {wjdz:row.wjdz, wjmc:row.wjmc},{
      headers: {   //解决后端接收时多了一个 =
       'Content-Type': 'application/json'
      }
   }).then(res => {
       this.$message.success("成功下载至桌面");
      })
}

        wjdz和wjmc是要传给后端的值。后端获取到文件的FTP路径的时候,路径末尾会莫名的多一个等于(=)的符号,反正我的是出现了,把headers加上就完美解决了

二、后端

        结尾处贴附后端全码

        1.用Map来接收前端传过来的数据

public void downloadFile(@RequestBody Map<String,String> map) throws UnsupportedEncodingException {

        String wjdz = map.get("wjdz");
        String wjmc = map.get("wjmc");
}

        2.获取的文件路径,比如C:\Users\Administrator\Desktop,中间的 \ 符号会被转义,所以需要转义回来,其它符号的转义可以百度一下哦。

//解决文件名中间的符号被转义(如“/”被转义成%2F)
wjdz = wjdz.replaceAll("%(?![0-9a-fA-F]{2})", "%2F");
String wjdzStr = URLDecoder.decode(wjdz, "UTF-8");

        3.在上传FTP文件的时候,为了防止重复的文件名在FTP服务器里出现,于是给每一个文件都设置了不同的文件编号,格式为xxx/2021-05-09/**************(*是uuid创建拼接在后面的),在FTP服务器里面下载文件的话需要找到具体的目录,然后再去下载具体的文件。接下来开始获取FTP文件的名称以及目录名

 //获取第一个“/”的位置
int index = wjdzStr.indexOf("/");

//获取第二个 “/” 的位置
index = wjdzStr.indexOf("/", index + 1);

//获取第二个 “/” 的位置后面的字符串
String result = wjdzStr.substring(index + 1);

//获取第二个 “/” 的位置之前的字符串
String menuDz = wjdzStr.substring(0,index + 1);

        通过以上方式来获取文件的目录和文件名称,result就是需要下载文件的名称,menuDz就是文件所在的FTP服务器里面的目录

        4.接下来就是设置文件的保存地址了

FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\" + wjmc )

        这里我是给设置到了桌面,后面的wjmc是该文件的中文名称,总不能给用户展示文件的路径吧......

        5.开始连接FTP服务器并且登录

FTPClient ftpClient = new FTPClient();
ftpClient.connect(hostName, port);//连接
ftpClient.login(userName, password);//登陆

        这里的hostname是自己的IP地址,port是端口号(默认21),userName是用户名,password就是密码了,如果在yml文件里面封装的有,便可以直接调用,没有就自己手动填上去也是一样的

        6.登上去之后便开始下载文件了,首先找到文件目录,然后再去下载

ftpClient.changeWorkingDirectory(menuDz);//切换目录

//下载文件( 获取FTP服务器指定目录的文件)
//参数result,服务器指定文件
//参数out,本地输出流(负责下载后写入)
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
ftpClient.retrieveFile(result,out);

         ftpClient.setFileType这个就是用来配置文件传输形式的,默认ASCII,我们一般都是配置用二进制形式传送

        7.最后最后就是退出登录和关闭连接了

ftpClient.logout();// 退出登录
ftpClient.disconnect();// 断开连接

        8.接下来就是后端的全码了

@PostMapping(value = "/downloadFile")
@ResponseBody
public void downloadFile(@RequestBody Map<String,String> map) throws UnsupportedEncodingException {

        String wjdz = map.get("wjdz");
        String wjmc = map.get("wjmc");

        //解决文件名中间的符号被转义(如“/”被转义成%2F)
        wjdz = wjdz.replaceAll("%(?![0-9a-fA-F]{2})", "%2F");
        String wjdzStr = URLDecoder.decode(wjdz, "UTF-8");

        FTPClient ftpClient = new FTPClient();
        int index = wjdzStr.indexOf("/"); //获取第一个“/”的位置
        index = wjdzStr.indexOf("/", index + 1);//获取第二个 “/” 的位置
        String result = wjdzStr.substring(index + 1);//获取第二个 “/” 的位置后面的字符串
        String menuDz = wjdzStr.substring(0,index + 1);//获取第二个 “/” 的位置之前的字符串
        try (FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\" + wjmc )) {

            FtpUtil ftpUtil = new FtpUtil();
            ftpClient.connect(ftpUtil.hostName, ftpUtil.port);//连接
            ftpClient.login(ftpUtil.userName, ftpUtil.password);//登陆
            ftpClient.changeWorkingDirectory(menuDz);//切换目录

            //下载文件( 获取FTP服务器指定目录的文件)
            //参数result,服务器指定文件
            //参数out,本地输出流(负责下载后写入)
            ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
            ftpClient.retrieveFile(result,out);

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ftpClient.logout();// 退出登录
                ftpClient.disconnect();// 断开连接
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

        记录这些方便自己的同时也想能帮助一下和我遇到同样困惑的人,有什么不足或者不对的地方还望大佬们指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java从FTP下载文件到本地前端+后端 的相关文章

  • 我在socket上设置了超时,发现这个值不能大于21

    我在socket上设置了超时 该值小于21秒才有效 21秒后发现超时还是21秒 public static void main String args SimpleDateFormat sdf new SimpleDateFormat yy
  • Google App Engine with Java - 运行 javac.exe 编译器时出错

    在 Windows XP 上 刚刚下载并解压谷歌应用程序引擎java sdk to C Program Files appengine java sdk 我已经安装了jdk C Program Files Java jdk1 6 0 20
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 解决 Java Checkstyle 错误:名称 'logger' 必须匹配模式 '^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$'

    使用 Eclipse Checkstyle 插件我看到以下错误 名称 logger 必须匹配模式 A Z A Z0 9 A Z0 9 我通过更改解决了此错误 private static final Logger logger Logger
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 每次我们调用浏览器时,在 selenium 中使用 driver.manage().window().maximize() 是否好?

    We use driver manage window maximize 最大化浏览器 我在网上看到一些使用的例子driver manage window maximize 尽管不需要最大化浏览器 例如 gmail 登录 我还看到使用 se

随机推荐

  • CPU内存磁盘IO过高问题处理

    CPU占用过高分析 可以用top命令查看哪一个进程占用cpu高 或者哪一个占用内存大 top 13 55 32 up 59 days 19 18 2 users load average 0 00 0 04 0 09 Tasks 161 t
  • 获取一周登陆3次以上的用户数,mysql

    select count 1 from select userId count distinct date format createTime Y m d from session user where date format create
  • PLSQL Developer连接远程数据库方式

    作者 Frank bettterMan 来源 CSDN 原文地址 https blog csdn net xintonghanchuang article details 60869189 1 直接通过IP连接 1 输入对应数据库用户名与密
  • 使用gradle创建 Java 工程

    如果显示连接超时 换网 不要用校园网 1 随便目录 在用cmd呼出终端 2 在终端输入gradle init 初始化 gradle init 2是项目 依稀记得 1是2的简化版 这里选2 我学的是java 所以3 这里选语言 三个默认 这里
  • OpenStack架构详解

    1 OpenStack概述 OpenStack既是一个社区 也是一个项目和一个开源软件 它提供了一个部署云的操作平台或工具集 其宗旨在于 帮助组织运行为虚拟计算或存储服务的云 为公有云 私有云 也为大云 小云提供可扩展的 灵活的云计算 Op
  • 【第四章】详解Feign的实现原理

    1 1 Feign概述 这篇文章主要讲述如何通过Feign去消费服务 以及Feign的实现原理的解析 Feign是Netflix开发的声明式 模板化的HTTP客户端 Feign可以帮助我们更快捷 优雅地调用HTTP API Feign是个H
  • VitePress开发记录(二)之LaTeX语法支持

    前言 当我在我的博客网站更新我的吴恩达机器学习笔记时 出现了一个情况 VitePress默认的markdown it解析器似乎无法渲染LaTeX数学公式 于是我去VitePress官方中查看issue是否有解决的方案 官方给出的解答是 这里
  • 华为OD机试真题-模拟商场优惠打折【2023Q1】

    题目内容 模拟商场优惠打折 有三种优惠券可以用 满减券 打折券和无门槛券 满减券 满100减10 满200减20 满300减30 满400减40 以此类推不限制使用 打折券 固定折扣92折 且打折之后向下取整 每次购物只能用1次 无门槛券
  • SpringBatch文章系列-SPL表达式的使用

    参考例子
  • 爬虫如何快速定位到加密入口

    这里有多种定位加密入口方法 通过打全局xhr断点找到加密入口 可以将在 处点击添加xhr断点 可以针对某个值进行打xhr断点 直接通过关键字找到加密入口 在前面文章讲述过https blog csdn net zhp980121 artic
  • Springboot+vue 社团管理系统(前后端分离)

    Springboot vue 社团管理系统 前后端分离 zero 项目功能设计图 一 数据库设计 项目准备 1 建表 2 表目录 二 前端编写 vue 1 搭建Vue框架 2 放入静态资源 assets文件包括static文件的静态文件 3
  • 2017 年提高组初赛

    第 6 题 1 5 分 若某算法的计算时间表示为递推关系式 T N 2 T N 2 N l o g N T N 2T N 2 NlogN T N 2T N 2 NlogN T N 2 2 T N 4 N 2 l o g N 2 2 T N
  • TencentOS-tiny 内存管理(十 二)- 动态内存

    一 内存管理 动态内存 概述 动态内存管理模块 提供了一套动态管理系统内存的机制 支持用户动态的申请 释放不定长内存块 API讲解 编程实例 1 在tos config h中 配置动态内存组件开关TOS CFG MMHEAP EN defi
  • 【Linux】进程基础

    文章目录 1 冯诺依曼体系 1 2操作系统 2 进程 2 1进程的概念 2 2 task struct 2 3进程的状态 2 4进程优先级 优先级VS权限 为何会存在优先级 Linux下的优先级相关概念 2 5其他重要概念 单道和多道程序设
  • warp shuffle实验

    实验一 shfl sync unsigned mask T var int srcLane int width warpSize mask 是参与的线程掩码 如0xffffffff var 是待广播的值 srclane 是被广播的 lane
  • gb28181抓包

    知乎一篇雄文 https zhuanlan zhihu com p 98533891 这是对照gb28181文档进行抓包的分析 nvr代理服务端 44 198 62 2 5061 44190012002000000001 代理客户端 44
  • jQuery选择器集锦(读《锋利的jQuery(第二版)》所摘)

    jQuery选择器分为基本选择器 层次选择器 过滤选择器和表单选择器 过滤选择器可以分为基本过滤 内容过滤 可见性过滤 属性过滤 子元素过滤和表单对象属性过滤选择器 input not myClass 选取class不是myClass的
  • linux 判断目录是否存在并创建

    1 用 int access const char pathname int mode 判断有没有此文件或目录 它区别不出这是文件还是目录 2 用 int stat const char file name struct stat buf
  • 计算机网络模型

    计算机网络OSI模型 Open Systems Interconnection model 是一种概念模型 它表征并标准化电信或计算系统的通信功能 而不考虑其基础内部结构和技术 其目标是多种通信系统与标准协议的互操作性 该模型将通信系统划分
  • Java从FTP下载文件到本地前端+后端

    一 前端 1 首先创建下载文件按钮