您的位置:首页 > 编程语言 > Java开发

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服务器中就可以看到上传的文件了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: