关键词:springboot,ftp
这篇来讲一下springboot如何实现ftp文件上传,接收前端框架上传的图片,把图片上传到ftp图片服务器,当然首先需要搭建ftp服务器。
1)pom.xml添加ftp依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
2)编写ftp上传工具类
package com.xiaoi.document.split.common.utils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
/**
* FtpUtil工具类 ftp文件上传类
*
* @Author Yuan Jingshan
* @Date 2018-05-09
*/
@Component
public class FtpUtil {
//ftp服务器ip地址
private static final String FTP_ADDRESS = "172.16.205.28";
//端口号
private static final int FTP_PORT = 21;
//用户名
private static final String FTP_USERNAME = "gzxiaoiftp";
//密码
private static final String FTP_PASSWORD = "gzxiaoi";
//图片路径
public final String FTP_BASEPATH = "/home/ftp/develop/";
public boolean uploadFile(String originFileName, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
int reply;
ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.makeDirectory(FTP_BASEPATH);
ftp.changeWorkingDirectory(FTP_BASEPATH);
ftp.storeFile(originFileName, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
}
3)编写控制层处理文件上传
package com.xiaoi.document.split.management.common.ftp; import com.xiaoi.document.split.common.utils.FtpUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * FtpUtil工具类 ftp文件上传类 * * @Author Yuan Jingshan * @Date 2018-05-30 */ @Controller @RequestMapping(value = "/docsplit/ftp") @Slf4j public class FtpController { @Autowired private FtpUtil ftpUtil; @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public Map<String, String> uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException { Map<String, String> map = new HashMap<>(); map.put("code", "0"); map.put("msg", "上传文件失败"); String fileName = file.getOriginalFilename(); log.info("上传文件:{}", fileName); InputStream inputStream = file.getInputStream(); String filePath = null; Boolean flag = ftpUtil.uploadFile(fileName, inputStream); if (flag == true) { log.info("上传文件成功!"); filePath = ftpUtil.FTP_BASEPATH + fileName; map.put("code", "1"); map.put("msg", "上传文件成功"); } map.put("path", filePath); return map; //该路径图片名称,前端框架可用ngnix指定的路径+filePath,即可访问到ngnix图片服务器中的图片 } }
4)前端使用layui文件上传
<div class="layui-form-item"> <label class="layui-form-label-block-resource">文件</label> <div class="layui-input-block-new-resource"> <input id="uploadResourceFile" name="title" lay-verify="title" autocomplete="off" class="layui-input" type="text" style="width: 70%; float: left;"> <button type="button" class="layui-btn" id="resource_file" style="float: right;"><i class="layui-icon"></i>浏览</button> </div> </div>
<script> layui.use('upload', function(){ var upload = layui.upload; //执行实例 var uploadInst = upload.render({ elem: '#resource_file', //绑定元素 url: $.common.getContextPath() + '/docsplit/ftp/upload', //上传接口 method: 'POST', accept: 'file', size: 50, before: function(){ // layer.load(); }, done: function(res){ debugger; if (!!res && $.constant.SUCCESS == res.code) { $("#uploadResourceFile").val(res.path); } else { $.common.layer.msg(res.msg,{icon: 0}); } },error: function(res){ $.common.layer.msg($.constant.EXCEPTION,{icon: 2}); } }); });
5)运行效果