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

2 篇文章 0 订阅
2 篇文章 0 订阅

一、前端

  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();
            }
        }
    }

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现从前端上传和下载PDF文件FTP服务器,可以使用Java编程语言和FTP客户端库。 首先,需要在前端创建一个文件上传表单,并设置相应的文件选择按钮、提交按钮和处理逻辑。用户选择要上传的PDF文件后,将文件发送给后端服务器。 接下来,后端使用Java编写一个处理上传文件的控制器。控制器接收到文件后,使用FTP客户端库连接到FTP服务器。可以使用Apache Commons Net库中提供的FTPClient类。通过FTPClient,可以使用connect()方法连接到FTP服务器,使用login()方法提供用户名和密码进行登录验证,使用setFileType()方法设置文件类型为二进制,并使用storeFile()方法将文件存储到FTP服务器指定的路径。 要实现从FTP服务器下载PDF文件,可以在前端创建一个下载按钮,用户点击按钮后,发起对控制器的请求。后端代码中,使用FTPClient连接到FTP服务器后,使用retrieveFile()方法从服务器下载指定的PDF文件到本地。 在实现上传和下载的过程中,需要注意异常处理和文件路径的设置。确保FTP服务器的地址、端口、用户名和密码正确,并确保FTP服务器的路径正确。 在整个过程中,还需要考虑文件的命名策略和权限管理。可以在上传文件时为文件生成唯一的文件名,避免文件冲突。此外,还可以设置FTP服务器的权限,确保上传的文件只能被授权的用户访问和下载。 通过以上步骤,就可以使用Java实现从前端上传和下载PDF文件FTP服务器了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值