springmvc 上傳文件至ftp服務器

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章