1.首先看一下我们的Service层代码(有详细注释)
package com.mmall.service.impl;
import com.google.common.collect.Lists;
import com.mmall.service.IFileService;
import com.mmall.util.FTPUtil;
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;
/**
* Created by geely
*/
@Service("iFileService")
public class FileServiceImpl implements IFileService {
private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
public String upload(MultipartFile file,String path){
//获取源文件
String fileName = file.getOriginalFilename();
//从后面开始获取文件的扩展名,加1是因为去掉.
String fileExtensionName = fileName.substring(fileName.lastIndexOf(".")+1);
//文件名如果重复地话会覆盖原来的问价,所以采用UUID来获取文件名
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 targetFile = new File(path,uploadFileName);
try {
//文件已经上传成功了
file.transferTo(targetFile);
//已经上传到ftp服务器上
FTPUtil.uploadFile(Lists.newArrayList(targetFile));
targetFile.delete();
} catch (IOException e) {
logger.error("上传文件异常",e);
return null;
}
//A:abc.jpg
//B:abc.jpg
return targetFile.getName();
}
}
2.需要一个连接服务器和上传用的代码
package com.mmall.util;
import org.apache.commons.net.ftp.FTPClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
/**
* @program: mmall
* @description: FTP工具
* @author: Hailong
* @create: 2018-08-01 15:53
**/
public class FTPUtil {
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 ftpPass = PropertiesUtil.getProperty("ftp.pass");
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> fileList){
FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass);
logger.info("开始连接ftp服务器");
//传到img文件夹下
boolean result = ftpUtil.uploadFile("img",fileList);
logger.info("开始连接ftp服务器,结束上传,上传结果:{}");
return result;
}
private boolean uploadFile(String remotePath,List<File> fileList){
boolean uploaded = true;
FileInputStream fis = null;
//连接FTP服务器
if(connectServer(this.ip,this.port,this.user,this.pwd)) {
try {
ftpClient.changeWorkingDirectory(remotePath);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("UTF-8");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
for (File fileItem : fileList) {
fis = new FileInputStream(fileItem);
//存储文件
ftpClient.storeFile(fileItem.getName(), fis);
}
} catch (IOException e) {
logger.error("上传文件异常", e);
uploaded = false;
e.printStackTrace();
} finally {
try {
fis.close();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploaded;
}
private boolean connectServer(String ip,int port,String user,String pwd){
boolean isSuccess = false;
ftpClient = new FTPClient();
try {
ftpClient.connect(ip);
isSuccess = ftpClient.login(user,pwd);
} catch (IOException e) {
logger.error("连接服务器异常",e );
}
return isSuccess;
}
private String ip;
private int port;
private String user;
private String pwd;
private FTPClient ftpClient;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public FTPClient getFtpClient() {
return ftpClient;
}
public void setFtpClient(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
}
为了防止耦合当然需要建一个properties文件,那么下面是文件里面的配置内容
ftp.server.ip=192.168.59.1 //自己的IPV4地址
ftp.user=geely //FTP服务器的用户名和密码
ftp.pass=geely
ftp.server.http.prefix=http://image.imooc.com/ //可以通过这个前缀,利用反向代理技术访问到自己本地FTP文件夹里面的资源,具体的话上网搜一下那个配置就OK了
3.这里需要一个配置文件,才能和后端代码共同使用(dispatcher-servlet.xml)
`
ServiceImpl
package com.mmall.service;
import org.springframework.web.multipart.MultipartFile;
public interface IFileService {
String upload(MultipartFile file, String path);
}
Contoller:
/**
* 文件的上传
* @param file
* @param request
* @return
*/
@RequestMapping("upload.do")
@ResponseBody
public ServiceResponse upload(HttpSession session,@RequestParam(value = "upload_file",required = false) MultipartFile file,HttpServletRequest request){
User user = (User)session.getAttribute(Const.CURRENT_USER);
if(user == null){
return ServiceResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用户未登录,请登录管理员");
}
if(iUserService.checkAdminRole(user).isSuccess()){
String path = request.getSession().getServletContext().getRealPath("upload");
String targetFileName = iFileService.upload(file,path);
String url = PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFileName;
Map fileMap = Maps.newHashMap();
fileMap.put("uri",targetFileName);
fileMap.put("url",url);
return ServiceResponse.createBySuccess(fileMap);
}else{
return ServiceResponse.createByErrorMessage("无权限操作");
}
}
5.写一个简单的JSP页面就去体验吧!