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下载文件到本地前端+后端 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 获取 FTP 服务器上的文件大小并将其放在标签上

    我正在尝试获取托管在FTP服务器并将其放入Label而 BackgroundWorker 在后台工作 我在用着 Try 来获取该值 但是该值在第一次尝试时被捕获 下载后 如果我按尝试再次获取它 那么它就可以工作 Note 第一次尝试时进度条
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 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 首先创建下载文件按钮