思路:文件先保存在項目的文件夾中(與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>