导入依赖包

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version>
</dependency>

还需要下载一个ftp.server 服务器工具

新建FTPUtil工具类

只在window上测试过,Linux没有测试

package com.comn.util;import com.aliyuncs.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.List;public class FileUtil {private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);private static String ftp_IP = "127.0.0.1";private static String ftp_user = "admin"private static String ftp_psw = "123456"private static Integer ftp_port = 21;private static String localPath = "G:\\";/***  上传* @param fileList* @param remotePath 服务器上的路径* @return*/public static boolean uploadFileFromFTP(List<File> fileList, String remotePath) {logger.info("ftp文件夹路径" + remotePath);FTPClient ftpClient = new FTPClient();FileInputStream fis = null;boolean result = false;String[] split = remotePath.split("/");try {logger.info("开始连接ftp服务器");ftpClient.setControlEncoding("gbk");ftpClient.connect(ftp_IP, ftp_port);ftpClient.login(ftp_user, ftp_psw);ftpClient.enterLocalPassiveMode();// 设置上传目录ftpClient.setBufferSize(1024);ftpClient.setConnectTimeout(10 * 1000);ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);for (String str : split) {if (StringUtils.isBlank(str)) {continue;}if (!ftpClient.changeWorkingDirectory(str)) {ftpClient.makeDirectory(str);ftpClient.changeWorkingDirectory(str);}}// 保存文件for (File fileItem : fileList) {fis = new FileInputStream(fileItem);ftpClient.storeFile(fileItem.getName(), fis);}} catch (NumberFormatException e) {System.err.println("FTP端口配置错误:不是数字:");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(fis);try {ftpClient.disconnect();} catch (IOException e) {throw new RuntimeException("关闭FTP连接发生异常!", e);}}logger.info("开始连接ftp服务器,结束上传,上传结果:{}", result);return result;}/***  下载* @param remotePath 服务器上的路径* @param fileName   要下载的文件*/public static boolean downloadFileFromFTP(String remotePath, String fileName) {boolean success = false;FTPClient ftp = new FTPClient();try {logger.info("开始连接ftp服务器");int reply;// 1. 连接ftp服务器, 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器ftp.connect(ftp_IP, ftp_port);// 2. 登录ftp服务器ftp.login(ftp_user, ftp_psw);ftp.enterLocalPassiveMode();ftp.setControlEncoding("gbk");// 3. 登录是否成功reply = ftp.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftp.disconnect();logger.error("连接服务器异常");return success;}// 设置上传目录ftp.changeWorkingDirectory(remotePath);FTPFile[] fs = ftp.listFiles();for (FTPFile ff : fs) {if (ff.getName().equals(fileName)) {File localFile = new File(localPath + "/" + ff.getName());OutputStream is = new FileOutputStream(localFile);logger.info("指定输出到本地路径:{}", localPath);ftp.retrieveFile(new String(ff.getName().getBytes("GBK"), "ISO-8859-1"), is);is.close();}}ftp.logout();success = true;} catch (IOException e) {e.printStackTrace();} finally {if (ftp.isConnected()) {try {ftp.disconnect();} catch (IOException ioe) {ioe.printStackTrace();}}}logger.info("开始连接ftp服务器,结束下载,下载结果:{}", success);return success;}}
  • service
package com.comn.service;import com.bolt.common.ServerResponse;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;public interface ILocalStorageService {String uploadFile(MultipartFile file, String path);ServerResponse<String> downloadFile(String fileName);}
  • serviceImpl
package com.comn.service.impl;import cn.hutool.core.date.DateUtil;
import com.bolt.common.ServerResponse;
import com.bolt.service.ILocalStorageService;
import com.bolt.shiro.util.UserContext;
import com.bolt.util.FileUtil;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.Date;@Service
public class ILocalStorageServiceImpl implements ILocalStorageService {private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);@Overridepublic String uploadFile(MultipartFile file, String path) {//        获取上传时文件名String fileName = file.getOriginalFilename();//获取扩展名(abc.jpg)----.jpg
//        String fileExtensionName = fileName.substring(fileName.lastIndexOf(".") + 1);logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}", fileName, path, fileName);Integer userId = 2;String remotePath=String.valueOf(userId);//新建c盘缓存文件File fileDir = new File(path);if (!fileDir.exists()) {fileDir.setWritable(true);fileDir.mkdirs();}File targetFile = new File(path, fileName);try {//上传到缓存中-文件已经上传成功了file.transferTo(targetFile);//已经上传到ftp服务器上FileUtil.uploadFileFromFTP(Lists.newArrayList(targetFile), remotePath);//删除缓存文件targetFile.delete();} catch (IOException e) {logger.error("上传文件异常", e);return null;}//A:abc.jpg//返回新文件名return remotePath+"/"+targetFile.getName();}@Overridepublic ServerResponse<String> downloadFile(String fileName) {Integer userId = 2;String remotePath=String.valueOf(userId);try {FileUtil.downloadFileFromFTP(remotePath, fileName);} catch (Exception e) {logger.error("下载异常", e);return ServerResponse.createByErrorMessage("下载异常");}return ServerResponse.createBySuccess();}}``
- controller```java
package com.bolt.controller.partal;import com.comn.common.ServerResponse;
import com.comn.service.ILocalStorageService;
import com.comn.util.FileUtil;
import com.comn.util.PropertiesUtil;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.util.Map;@RestController
public class UserUploadFileController {@Autowiredprivate ILocalStorageService fileService;@PostMapping("upload_file")public ServerResponse uploadFile(MultipartFile file, HttpServletRequest request) {// 获取tomcat服务器目录路径String path = request.getSession().getServletContext().getRealPath("upload");//新文件名称String targetFileName = fileService.uploadFile(file, path);//文件完整路劲String url = PropertiesUtil.getProperty("ftp.server.http.prefix") + targetFileName;Map fileMap = Maps.newHashMap();fileMap.put("uri", targetFileName);fileMap.put("url", url);
//        fileMap.put("fileName", file.getOriginalFilename());return ServerResponse.createBySuccess(fileMap);}// fileName 文件名称@PostMapping("download_file")public ServerResponse downloadFile(String fileName) {return fileService.downloadFile(fileName);}
}

遇到的问题

  • 上传文件大小限制,springboot默认文件上传为1M需要设置
  • 文件名称为中文时,无法上传下载
  • 下载压缩文件,文件被损坏,文件大小为0kb

【SpringBoot】:springboot整合FTP文件上传与下载功能相关推荐

  1. Springboot实现简单的文件上传和下载功能

    一.第一步, 第一步依然是创建数据库,我简单设计了三个字段(file_id,file_name,create_time) CREATE TABLE `txtfile` (`file_id` int N ...

  2. php从ftp下载文件到本地,php使用ftp实现文件上传与下载功能

    本文实例为大家分享了php ftp文件上传与下载的具体代码,供大家参考,具体内容如下 ftp文件上传 php自带有ftp操作的函数包,一个比较简单实现的ftp文件上传操作可以通过以下几个步骤来完成: ...

  3. XMLHttpRequest 对象实现文件上传和下载功能

    XMLHttpRequest 对象实现文件上传和下载功能(内含源码哦

  4. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!-配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  5. Springboot中常用的文件上传和下载通用接口

    记录下通用的文件上传和下载接口,一般的开发中都是会使用到的,不过写的最简单的版本. 文章目录 程序测试 本文小结 程序测试 在yml中配置一个文件保存的路径 #保存文件的路径 common:file: ...

  6. 代理连接FTP实现上传和下载功能

    近日要实现FTP自动上传下载功能,但在办公区域受网络限制导致失败,最终研究通过办公区域的代理完成连接,并实现FTP上传和下载功能,同时将已上传和已下载的文件移动到默认的备份目录,保证定时任务不会重复获 ...

  7. java 中 FtpClient 实现 FTP 文件上传、下载

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 源代码大部分是网上找的,查来查去,找到几个可以用的例子,改来改去,揉合成现在这个样子. 一. jar ...

  8. ftp文件上传和下载

    ftp参数实体 public class FTPParameter { private String host;private int port;private String user;private ...

  9. 使用API进行FTP文件上传和下载

    又有几天没发新贴了,刚才有点闲瑕,便随手写了一个使用FTP上传和下载文件的类. 类代码如下: Option Explicit'* *********************************** ...

最新文章

  1. php中json_encode中文编码问题分析
  2. ASP.NET中进行消息处理(MSMQ)
  3. SAP License:BWBCS学习笔记20210304
  4. Ubuntu 下 MySQL 数据自执行备份
  5. Atitit Queue consum algo 队列消费算法fifo lifo ro目录1. 队列消费算法 11.1. FIFO 先入先出 11.2. LIFO 后入先出 不能多开 1
  6. ai智能时代教育内容的改变_人工智能正在改变我们的评论方式
  7. 【140815】VC编程技巧280例 电子书下载
  8. nginx流媒体服务器性能,搭建nginx流媒体服务器(支持HLS)
  9. 华为云——开发者技能测评
  10. Excel -- 排序与排名
  11. 解析DELLR710服务器迁移操作内容
  12. 以太坊数据结构与存储分析
  13. C/C++图形库EasyX快速上手指南【1】——绘图窗口和基本图形文字绘制
  14. [我一直想看到的文章 好好保存赏析]微软、英特尔和摩根的比较
  15. 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
  16. 【大数据之 Flume】入门到放弃
  17. 海信网络科技软件研发实习面试
  18. Vue3百度网盘下载链接
  19. OpenStack unit tests 环境调试
  20. CAD—dxf dwg格式解析库

热门文章

  1. 人工智能在教育中的应用场景
  2. python界面小游戏贪吃蛇_用Python实现童年小游戏贪吃蛇
  3. 【有奖测评】我的产品你来反馈,有奖
  4. 使用VS Code开发AngularJS 2 第一个应用程序
  5. FFmpeg功能命令集合(超详细)
  6. T1320 均分纸牌
  7. 【模型压缩】Channel Pruning for Accelerating Very Deep Neural Networks算法笔记
  8. 制作全集成定制版Office2007安装包
  9. 新建好的网站如何被搜索引擎(Google和百度)收录?
  10. webRTC(十四):webrtc 端到端文本聊天