SpringMvc 文件上传并且实现与ftp服务器的对接
2017-08-23 22:15
459 查看
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 blockuploaded = 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服务器中就可以看到上传的文件了
相关文章推荐
- 使用SpringMVC进行文件上传以及与FTP服务器对接
- Java连接FTP服务器并且实现对其文件的上传和下载
- Java连接FTP服务器并且实现对其文件的上传和下载
- Java连接FTP服务器并且实现对其文件的上传和下载
- Java连接FTP服务器并且实现对其文件的上传和下载
- Java连接FTP服务器并且实现对其文件的上传和下载
- VC实现上传文件到FTP服务器
- Windows下通过bat脚本实现自动上传文件到ftp服务器
- Java FTP 实现跨服务器文件上传下载
- 利用jsp+uploadify插件实现删除上传到ftp服务器里面的文件
- 实现自动上传文件到ftp服务器的BAT脚本分享
- springmvc 文件上传实现(不是服务器的)
- 在AIX8.0下实现ftp上传指定文件到ftp服务器
- java实现把文件上传至ftp服务器
- java实现将文件上传到ftp服务器的方法
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- 点滴积累【C#】---C#实现上传word将路径保存到数据库,文件保存到服务器。并且按照名称读取服务器的word
- winForm读取本地文件并且上传到服务器(非FTP)
- java实现把文件上传至ftp服务器
- java实现把文件上传至ftp服务器