/**
 * @author zyt
 * @version : 2017年2月27日
 */
public class FtpUtils {
	/** 
	 * 复制某个文件夹下面的所有内容到ftp服务器上
	 * @param realPath String 项目的真实路径 如:D:\tomcat7x64\tomcat7x64\webapps\lnwqxsgj\
	 * @param oldPath String 原文件夹的真实路径 如:D:\tomcat7x64\tomcat7x64\webapps\lnwqxsgj\file
	 * @param newPath FtpClient ftp服务器 
	 * @return boolean
	 * 
	 */ 
	public static boolean copyFolder(String realPath,File oldFile,FtpClient ftpClient) { 
		try {
			if (!oldFile.exists()) {
				System.out.println("FtpUtils.copyFolder()找不到指定的文件!");
				return false;
			}
			//如果是文件夹
			if (oldFile.isDirectory()) {
				if (oldFile.list().length == 0) {
					try {
						//得到从项目名开始的子目录
						String dir = oldFile.toString().replace(realPath,"");  
						if (!dir.startsWith(File.separator)) {
							dir = File.separator+dir;
						}//以上代码得出   如: /file
						ftpClient.makeDirectory(dir);  //在ftp服务器创建文件夹
					} catch (Exception e) {
					}
				}
				String[] oldFiles= oldFile.list();
				for (String file : oldFiles) {
					copyFolder(realPath,new File(oldFile,file), ftpClient);
				}
			}else{
				//得到从项目名开始的子目录
				String dir = oldFile.toString().replace(realPath,"");     //如:  file\a.txt
				dir = dir.substring(0,dir.indexOf(oldFile.getName())-1);  //如: file
				if (!dir.startsWith(File.separator)) {
					dir = File.separator+dir;
				}
				try {
					ftpClient.makeDirectory(dir);  //在ftp服务器创建文件夹
					ftpClient.changeDirectory(dir); //把远程系统上的目录切换到参数dir所指定的目录  
				} catch (Exception e) {
					ftpClient.changeDirectory(dir); //把远程系统上的目录切换到参数dir所指定的目录  
				}
				InputStream in = new FileInputStream(oldFile);
				ftpClient.putFile(oldFile.getName(), in); //把文件输出到ftp服务器上
				in.close();
			}
		} 
		catch (Exception e) { 
			System.out.println("复制整个文件夹内容操作出错"); 
			e.printStackTrace(); 
		}
		return true; 
	}
	
	/** 
	 * 连接ftp服务器
	 * @param ip:FTP服务器的IP地址
	 * @param user:port:端口号
	 * @param user:登录FTP服务器的用户名
	 * @param password:登录FTP服务器的用户名的口令
	 * @param path:把远程系统上的目录切换到参数path所指定的目录   
	 * @return FtpClient 
	 */ 
	public static FtpClient connectServer(String ip, int port, String user,
			String password, String path) throws FtpProtocolException, IOException {  
		FtpClient ftpClient = FtpClient.create();       
		SocketAddress addr = new InetSocketAddress(ip,port);        
		ftpClient.connect(addr);              
		ftpClient.login(user, password.toCharArray());   
		if (path.length() != 0){                       
			//把远程系统上的目录切换到参数path所指定的目录                   
			ftpClient.changeDirectory(path);       
		}        
		return ftpClient;
	}
	
	/** 
	 * 连接ftp服务器
	 * @param path:把远程系统上的目录切换到参数path所指定的目录   
	 * @return FtpClient 
	 */ 
	public static FtpClient connectServer(String path) throws FtpProtocolException, IOException { 
		//获取properties文件里配置的数据
		PropertyResourceBundle res = (PropertyResourceBundle) PropertyResourceBundle.getBundle("ftpUpload");
		String ip = res.getString("ftpUpload.ip");
		Integer port = Integer.valueOf(res.getString("ftpUpload.port"));
		String user = res.getString("ftpUpload.user");
		String password = res.getString("ftpUpload.password");
		
		FtpClient ftpClient = FtpClient.create();       
		SocketAddress addr = new InetSocketAddress(ip,port);        
		ftpClient.connect(addr);              
		ftpClient.login(user, password.toCharArray());   
		if (path.length() != 0){                       
			//把远程系统上的目录切换到参数path所指定的目录                   
			ftpClient.changeDirectory(path);       
		}        
		return ftpClient;
	}
}

 

 

/**
 * @author zyt
 * @version : 2017年2月22日
 */
public class UploadFileServiceImpl implements UploadFileService {  

	private FtpClient ftpClient = null;
	//将服务器中的文件上传到ftp服务器上
	public void upload(){ 
		try {
			// 连接ftp服务器
			ftpClient = FtpUtils.connectServer("");
			WebApplicationContext application = ContextLoader.getCurrentWebApplicationContext();
			String path = application.getServletContext().getRealPath("/");
			File oldFile = new File(path,"file");
			boolean flag = FtpUtils.copyFolder(path,oldFile, ftpClient);  //复制文件夹以及下面的所有内容到ftp服务器上
			deleteAllFile(oldFile,oldFile.getName());  //删除文件夹以及下面的所有内容
			System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"提交到ftp服务器中...");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftpClient != null) {
				try {
					ftpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	} 
	/**
	 * 删除文件夹以及下面的所有文件
	 * @param file 文件夹路径
	 * @param excludeFile 指定不需要删除的空文件夹
	 */
	public void deleteAllFile(File file,String excludeFile){
		try {
			if (!file.exists()) {
				System.out.println("UploadFileServiceImpl.deleteAllFile()找不到指定文件!");
				return;
			}
			if (file.isDirectory()) {
				String[] list = file.list();
				for (String file2 : list) {
					deleteAllFile(new File(file,file2),excludeFile);
				}
				//过滤不需要删除的空文件夹
				if (!file.getName().equals(excludeFile)) {
					file.delete();
				}
			}else{
				file.delete();
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("删除文件夹以及下面的所有文件出错!");
		}
	}
}

 

<!--=======================定义定时任务=====================================-->

	<bean id="methodInvokingJobDetail"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<bean class="cmcc.jx.ict.xsgj.upload.ftp.service.impl.UploadFileServiceImpl"/>
		</property>
		<property name="targetMethod" value="upload" />
		<property name="concurrent" value="false" /><!-- 作业不并发调度 -->
	</bean>
	
	<!--=======================定义定时任务的触发器====================================-->
	
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail" ref="methodInvokingJobDetail" />  
	<!-- 每天12:00运行一次 -->
	
		<property name="cronExpression" value="0 0 0 * * ?" />
	</bean> 
	
	<!--=======================定义触发器的调度工厂===================================-->

	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTrigger" />
			</list>
		</property>
	</bean>

 

/**
 * 文件下载过滤器
 * @author zyt
 * @version : 2017年3月1日
 */
public class DownloadFilter implements Filter{

	FilterConfig filterConfig	= null;
	
	public void init(FilterConfig filterConfig) throws ServletException{
		this.filterConfig = filterConfig;
	}

	public void destroy(){
		this.filterConfig = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		//得到当前页面的URI
		String uri = URLDecoder.decode(req.getRequestURI(),"UTF-8");	 // lnwqxsgj/file/abc1/1.xls
		//去除项目名
		uri = uri.replace(req.getContextPath(),"");			// /file/abc1/1.xls
		FtpClient ftpClient;
		//判断是否是以该字符串开头  如果是就进行过滤
		if (uri.startsWith("/file/")) {
			//得到该项目的路径
			String realPath = req.getServletContext().getRealPath("/");  //D:\tomcat7x64\tomcat7x64\webapps\lnwqxsgj\
			//拼接得到该请求文件的绝对路径
			File file = new File(realPath,uri);	//D:\tomcat7x64\tomcat7x64\webapps\lnwqxsgj\file\abc1\1.xls
			//判断是否存在
			if (!file.exists()) {
				System.out.println("服务器不存在!");
				try {
					//得到该文件对应ftp服务器目录
					String realPath2 = uri.substring(0,uri.lastIndexOf("/")); // /file/abc1
					//连接ftp服务器 并且把目录切换到所指定的目录 
					ftpClient = FtpUtils.connectServer(realPath2);
					//在ftp服务器上读取该文件
					ftpClient.getFile(file.getName(), response.getOutputStream());
					System.out.println("ftp服务器存在!");
					System.out.println(realPath2+":"+file.getName());
					return;
				} catch (Exception e) {
					System.out.println("ftp服务器不存在!");
				}
			}else{
				System.out.println("服务器存在!");
			}
		}
		chain.doFilter(req, resp);
	}
}

 

 

quartz定时任务重要jar包

http://pan.baidu.com/s/1jIoLVam