使用SpringMVC进行文件上传以及与FTP服务器对接

在项目中,很多时候需要进行文件上传,下面这个过程是我在一次开发过程中使用的文件上传步骤,运用到SpringMVC的文件上传,以及和FTP服务器进行对接。

在pom.xml加入上传文件所需要的bean

  <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.2.2</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.0.1</version>
    </dependency>

在dispatcher-servlet.xml中加入对文件大小,文件编码等信息

    <!-- 文件上传 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/> <!-- 10m -->
        <property name="maxInMemorySize" value="4096" />
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

后台上传大致流程

这里写图片描述

FileService源码展示

源码说明:为了更方便的使用,我是声明了一个IFileService接口类,供后台调用,下面是实现接口类的代码


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 xiao on 2018/1/21.
 */
@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();
        //扩展名
        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()){
            //使文件可以改,因为Tomcat发布服务后,文件的权限不一定是可以改的
            fileDir.setWritable(true);
            //使用dirs是为了解决上传的路径中,如果有文件夹的没有创建,其会自动创建文件夹
            fileDir.mkdirs();
        }
        File targetFile = new File(path,uploadFileName);
        try {
            file.transferTo(targetFile);
            //到此为止,文件已经上传服务器成功

            //下一步是把文件上传到FTP服务器,与FTP文件服务器对接
            FTPUtil.uploadFile(Lists.newArrayList(targetFile));
            //已将文件上传FTP

            //上传完之后,删除upload下面的文件
            targetFile.delete();

        } catch (IOException e) {
            logger.error("上传文件异常",e);
            return null;
        }

        return  targetFile.getName();

    }

}

FTPUtil源码展示

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.print.DocFlavor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

/**
 * Created by xiao on 2018/1/21.
 */
public class FTPUtil {

    private static 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");
    FTPUtil(String ip,int port,String user,String pwd){
        this.ip = ip;
        this.port = port;
        this.pwd = pwd;
    }


    /**
     * 对外暴露的上传文件方法
     * @param fileList
     * @return
     */
    public static boolean  uploadFile(List<File> fileList) throws IOException {
        FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass);
        logger.info("开始连接FTP服务器");
        //把异常抛给service层,不在此处理
        boolean result = ftpUtil.uploadFile("img",fileList);
        logger.info("开始连接FTP服务器,结束上传,上传结果{}",result);
        return result;
    }

    private boolean uploadFile(String remotePath,List<File> fileList) throws IOException {
        boolean uploaded = true;
        FileInputStream fis = null;
        //连接FTP服务器
        if(connectServer(this.getIp(),this.getUser(),this.getPwd())){
            try {
                ftpClient.changeWorkingDirectory(remotePath);
                ftpClient.setBufferSize(1024);
                ftpClient.setControlEncoding("UTF-8");
                //设置成二进制格式可以防止乱码
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                //被动模式存储
                ftpClient.enterLocalPassiveMode();
                //遍历文件存储
                for(File fileItem : fileList){
                    //把文件转成文件流
                    fis = new FileInputStream(fileItem);
                    //调用storeFile方法存储
                    ftpClient.storeFile(fileItem.getName(),fis);
                }
            } catch (IOException e) {
                logger.error("上传文件异常",e);
                uploaded = false;

            }
            finally {
                //关闭连接和文件流
                fis.close();
                ftpClient.disconnect();


            }
        }
        return uploaded;

    }

    /**
     * 连接FTP服务器
     * @param ip
     * @param user
     * @param pwd
     * @return
     */
    private boolean connectServer(String ip, String user,String pwd ){
        boolean isSuccess = false;
        ftpClient = new FTPClient();
        try{
            ftpClient.connect(ip);
            isSuccess =  ftpClient.login(user,pwd);
        }catch (IOException e){
            logger.error("FTP服务器连接失败",e);

        }
        return isSuccess;
    }
  private String ip ;
    private int port;
    private String user;
    private String pwd;
    private FTPClient ftpClient ;

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public static String getFtpTp() {
        return ftpIp;
    }

    public static void setFtpTp(String ftpTp) {
        FTPUtil.ftpIp = ftpTp;
    }

    public static String getFtpUser() {
        return ftpUser;
    }

    public static void setFtpUser(String ftpUser) {
        FTPUtil.ftpUser = ftpUser;
    }

    public static String getFtpPass() {
        return ftpPass;
    }

    public static void setFtpPass(String ftpPass) {
        FTPUtil.ftpPass = ftpPass;
    }

    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;
    }







}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值