SpringMvc 文件上传并且实现与ftp服务器的对接

来源:互联网 发布:淘宝店贷款 编辑:程序博客网 时间:2024/06/08 19:09

1:先声明一个文件服务类

@Service("iFileService")public class IFileServiceImpl implements IFileService{   private Logger logger = LoggerFactory.getLogger(IFileServiceImpl.class);   //通过路径获得上传文件的路径   public String upload(MultipartFile file,String path){      //获得原始文件路径名      String fileName = file.getOriginalFilename();      logger.info("in service fileName is " + fileName);      //获得扩展名      //abc.jpg ---> jpg      String fileExtentionName = fileName.substring(fileName.lastIndexOf(".") + 1);      //上传文件名 防止上传形同的文件名而造成文件的覆盖      String uploadFileName = UUID.randomUUID().toString() + "." + fileExtentionName;      logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}",fileName,path,uploadFileName);      //创建一个文件对象      File fileDir = new File(path);      logger.info("fileDir is " + fileDir.exists());      if(!fileDir.exists()){         //看一看该文件是否存在:如果不存在创建之         //如果存在的话将写权限打开         fileDir.setWritable(true);         fileDir.mkdirs();      }      //path路径下创建一个子路径或者文件      File targetFile = new File(path,uploadFileName);      logger.info("in service targetFile is " + targetFile);      try {         //将文件提交到目的地文件系统中      file.transferTo(targetFile);      //文件已经上传成功      //targetFile上传到ftp服务器中      FtpUtil.uploadFile(Lists.newArrayList(targetFile));      //上传到ftp服务器中成功      //上传完成之后删除upload下的文件        targetFile.delete();         } catch (IllegalStateException | IOException e) {            logger.error("error",e);      return null;   }      return targetFile.getName();   }   }
在upload方法中:传进来两个参数;MultipartFile 和路径名这里的path是应用的根目录的绝对地址,如果你用的是Tomcat的话他就是
你部署的项目的根目录。
1:利用file.getOringinalFilename获得文件名字以利于后期的文件加工。
2:获得文件的扩展名
3:对该文件的名字进行重新的命名保证该文件是独一无二的
4:创建一个文件对象,检查路径或者路径下的问价夹是否存在,如果不存在就打开写权限进行文件夹的建立
5:建立目标文件夹是Path+fileName的全新路径名
6:将文件提交到服务器对应的路径中:file.transferTo(targetFilename);
7:将上传后的文件提交到ftp服务器中这里了涉及到与ftp服务器的对接,下面拿出来单独说明:
关键类:FTpUtil
public class FtpUtil {   //生成一个日志类   private static Logger logger = LoggerFactory.getLogger(FtpUtil.class);   //用来加载配置文件中的信息   private static String ftpId = 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) throws IOException{      FtpUtil ftpUtil = new FtpUtil(ftpId,21,ftpUser,ftpPass);      logger.info("开始连接ftp服务器");      boolean result = ftpUtil.uploadFile("imag",fileList);      logger.info("上传文件完成:结果:{}",result);      return result;   }   private boolean uploadFile(String remotePath,List<File> fileList) throws IOException{      boolean uploaded = true;      FileInputStream fis = null;      //连接到ftp服务器      if(connectFtpServer(this.ip,this.port,this.user,this.pwd)){         try {            //切换工作路径            ftpClient.changeWorkingDirectory(remotePath);            //设置字符编码            ftpClient.setControlEncoding("UTF-8");            //配置缓冲区            ftpClient.setBufferSize(1024);            //将文件类型设置成二级制文件的类型防止乱码的发生            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);            //设置为被动传输模式            ftpClient.enterLocalPassiveMode();            for(File fileItem:fileList){               fis = new FileInputStream(fileItem);               ftpClient.storeFile(fileItem.getName(),fis);            }         } catch (IOException e) {            // TODO Auto-generated catch block                uploaded = false;                       logger.error("上传错误",e);         }finally{            fis.close();            ftpClient.disconnect();         }         return uploaded;      }      return false;   }   //连接到ftp服务器   private boolean connectFtpServer(String ip,int port,String user,String pass){      boolean isSuccess = false;      ftpClient = new FTPClient();      try {         ftpClient.connect(ip);         isSuccess = ftpClient.login(user, pass);         logger.info("ftp connect is " + isSuccess);      } catch (IOException e) {         logger.error("连接异常",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;   }      }
要想连接服务器就必须知道其ip地址和用户名和密码:
这里的用户名和密码及ip地址从配置文件中读出来:利用PropertiesUtil这个类:
public class PropertiesUtil {    private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);    private static Properties props;    static {        String fileName = "listore.properties";        props = new Properties();        try {            props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8"));        } catch (IOException e) {            logger.error("读取配置文件出错",e);        }    }    public static String getProperty(String key){        String value = props.getProperty(key.trim());        if(StringUtils.isBlank(value)){            return null;        }        return value.trim();    }    public static String getProperty(String key,String defaultValue){        String value = props.getProperty(key.trim());        if(StringUtils.isBlank(value)){            value = defaultValue;        }        return value.trim();    }}
该工具来设置了一个静态代码块,进行配置文件流的读取操作,

工作原理是:

1:首先先将文件进行封装提交到服务器的响应目录里面,

2:再将文件上传到ftp服务器中去。

3:删除该文件在服务器中的位置,不要删除目录

4:然后在ftp服务器中就可以看到上传的文件了