springmvc 上传文件至ftp服务器

版权声明: https://blog.csdn.net/qq_37185081/article/details/85257967

思路:文件先保存在项目的文件夹中(与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>

猜你喜欢

转载自blog.csdn.net/qq_37185081/article/details/85257967