思路:文件先保存在项目的文件夹中(与WEB-INF平级),再上传到ftp服务器,然后删除项目中的文件,返回域名+名称。
类的引用顺序:controller -- service -- serviceImpl -- FTPutil -- propertiesUtil -- properties
类的作用:请求分发 -- 接口 -- 实现接口的具体业务逻辑 -- ftp工具类 -- 读取properties文件 -- ftp参数配置
从后往前写,可能比较容易理解:
pp.properties
ftp.server.ip = 00.00.00.00
ftp.user = xx
ftp.pass = xx
ftp.server.http.prefix = http://images.xx.xx/
ftp.prot = 21
PropertiesUtil
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
public class PropertiesUtil {
//添加日志
private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
//添加proterties
private static Properties properties;
static{
String fileName = "pp.properties";
properties = new Properties();
try {
properties.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName)));
} catch (IOException e) {
logger.error("配置文件读取异常",e);
}
}
public static String getProperty(String key){
String value = properties.getProperty(key.trim());
if(StringUtils.isBlank(value)){
return null;
}
return value;
}
public static String getProperty(String key,String defaultValue){
String value = properties.getProperty(key.trim());
if(StringUtils.isBlank(value)){
return defaultValue;
}
return value;
}
}
FTPUtil
import org.apache.commons.net.ftp.FTPClient;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;
public class FTPUtil {
private String ip;
private int port;
private String user;
private String pwd;
private FTPClient ftpClient;
//省略get set
private static final Logger logger = LoggerFactory.getLogger(FTPUtil.class);
//获取配置文件中的配置参数
private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip");
private static String ftpUser = PropertiesUtil.getProperty("ftp.user");
private static String ftpPwd = PropertiesUtil.getProperty("ftp.pass");
private static int ftpPort = Integer.valueOf(PropertiesUtil.getProperty("ftp.prot")).intValue();
//构造方法,赋值value
public FTPUtil(String ip, int port, String user, String pwd) {
this.ip = ip;
this.port = port;
this.user = user;
this.pwd = pwd;
}
//外部调用方法
public static boolean uploadFile(List<File> files) throws IOException {
FTPUtil ftpUtil = new FTPUtil(ftpIp,ftpPort,ftpUser,ftpPwd);
logger.info("开始连接ftp服务器!");
//当天的年月日作为目录名称
String catalogue = DateTimeUtil.dateToStr(new Date(),"yyyyMMdd");
boolean result = ftpUtil.uploadFile(catalogue,files);
logger.info("开始连接ftp服务器,结束上传,上传结果:{}",result);
return result;
}
//内部调用方法,连接ftp
private boolean uploadFile(String remotePath,List<File> files) throws IOException {
boolean uploaded = true;
FileInputStream fis = null;
if(connectServer(this.ip,this.port,this.user,this.pwd)){
try {
//判断这个目录是否存在,不存在则进行创建
ftpClient.makeDirectory(remotePath);
//切换到remodePath目录
ftpClient.changeWorkingDirectory(remotePath);
//设置1m缓冲
ftpClient.setBufferSize(1024);
//设置编码
ftpClient.setControlEncoding("UTF-8");
//设置文件类型:二进制文件
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//被动模式
ftpClient.enterLocalPassiveMode();
for(File file : files){
fis = new FileInputStream(file);
ftpClient.storeFile(file.getName(),fis);
}
} catch (IOException e) {
logger.error("上传文件异常",e);
uploaded = false;
}finally {
fis.close();
ftpClient.disconnect();
}
}
return uploaded;
}
//连接ftp服务器
private boolean connectServer(String ip,int port,String user,String pwd){
boolean isSuccess = false;
ftpClient = new FTPClient();
try {
ftpClient.connect(ip,port);
isSuccess = ftpClient.login(user,pwd);
} catch (IOException e) {
logger.error("连接FTP服务器异常",e);
}
return isSuccess;
}
public static void main(String[] args) {
String format = "yyyyMMdd";
DateTime dateTime = new DateTime(new Date());
System.out.println(dateTime.toString(format));
}
}
FileServeiceImpl
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.UUID;
@Service
public class FileServeiceImpl implements IFileService {
private static final Logger logger = LoggerFactory.getLogger(FileServeiceImpl.class);
public String upload(MultipartFile file,String path){
logger.info("upload的绝对地址:{}",path);
//获取文件名
String fileName = file.getOriginalFilename();
//获取文件名的扩展名
String fileExtensionName = fileName.substring(fileName.lastIndexOf(".")+1);
//创建一个新名称,等下用于上传文件的名称
String uploadFileName = UUID.randomUUID().toString() + "." + fileExtensionName;
logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}",fileName,path,uploadFileName);
File fileDir = new File(path);
//如果目录不存在,则创建该目录
if(!fileDir.exists()){
//获取权限
fileDir.setWritable(true);
//创建目录
fileDir.mkdirs();
}
//把上传路径和新文件名传入新file对象
File targetFile = new File(path,uploadFileName);
try {
//文件写入传入的目录中
file.transferTo(targetFile);
//把写入的文件上传到ftp服务器中
FTPUtil.uploadFile(Lists.newArrayList(targetFile));
//删掉tomcat中的文件
targetFile.delete();
} catch (IOException e) {
logger.error("上传文件异常",e);
return null;
}
return targetFile.getName();
}
}
IFileService
import org.springframework.web.multipart.MultipartFile;
public interface IFileService {
String upload(MultipartFile file, String path);
}
controller
@RequestMapping("upload")
@ResponseBody
public ServerResponse upload(HttpSession session,
@RequestParam(value = "upload_file",required = false)MultipartFile files, HttpServletRequest request){
//获取到upload的绝对路径(upload是目录保存在tomcat下)
String path = request.getSession().getServletContext().getRealPath("upload");
String targetFileName = iFileService.upload(files,path);
String url = PropertiesUtil.getProperty("ftp.server.http.prefix") + targetFileName;
Map fileMap = Maps.newHashMap();
fileMap.put("uri",targetFileName);
fileMap.put("url",url);
return ServerResponse.createBySuccess(fileMap);
}
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>demo</title>
</head>
<body>
<h2>Hello World!</h2>
<span>springmvc上传文件</span>
<form name="form1" action="/manager/product/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload_file">
<input type="submit" value="上传">
</form>
</body>
</html>