Listener para Upload de arquivos estáticos

Quando o usuário coloca um arquivo estático numa pasta pré-definida do servidor, um servlet (listener) faz o upload para vários outros servidores deste arquivo (cópias).
Estou precisando de um servlet que faça isso. Alguma sugestão? Obrigado!

Procure por Commons File Upload.

você está querendo fazer uma aplicação web para isto? Bem é possível, mas existe ferramentas que já fazem este serviço. Veja com alguém de infra-estrutura que você saberá quais são estes softwares. Você pode criar uma classe multhread para fazer este serviço… que fica lá vendo de foi feita alguma alteração neste diretório…

:joia:

Obrigado pelo retorno. Não imaginava que fosse tão rápido!

Graças a ajuda de vcs, consegui montar um servlet para tal fim.
Segue o código para quem interessar:

web.xml:

  <servlet>
    <servlet-name>UpLoadListenerServlet</servlet-name>
    <servlet-class>br.com.listener.UpLoadListenerServlet</servlet-class>
    <init-param>
      <param-name>origem</param-name>
      <param-value>C:\origem</param-value>
    </init-param>
    <init-param>
      <param-name>destino</param-name>
      <param-value>C:\destino</param-value>
    </init-param>
    <init-param>
      <param-name>ciclo</param-name>
      <param-value>1</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

servlet:

package br.com.listener;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class UpLoadListenerServlet extends GenericServlet {
	// Timer
	private Timer timer;
	
	// Ciclo (default: 1s)
	private int ciclo = 1;
	private String origem = "";
	private String destino = "";

	public void init() throws ServletException {
		//this.log("Inicializando...");
		// pasta origem (lê do web.xml)
		this.origem = getServletConfig().getInitParameter("origem");
		// pasta destino (lê do web.xml)
		this.destino = getServletConfig().getInitParameter("destino");
		this.ciclo = Integer.parseInt(getServletConfig().getInitParameter(
				"ciclo"));
		//this.log("Inicializado!");
		this.timer = new Timer(true);
		this.timer.schedule(new RemindTask(), 0, ciclo * 1000);
	}

	public void destroy() {
		//this.log("Finalizando...");
		this.timer.cancel();
		this.timer = null;
		//this.log("Finalizado!");
	}

	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {

	}

	class RemindTask extends TimerTask {
		public void run() {
			//log("Execução iniciada");
			try {
				SynchronizeFiles(origem, destino);
			} catch (Exception e) {
				e.printStackTrace();
				log(e.toString());
			}
			//log("Executada!");
		}
	}
	
	public void SynchronizeFiles(String origem, String destino) {
		File source = new File(origem);
		File target = new File(destino);
		File[] sourceFiles = source.listFiles();
		File[] targetFiles = null;
		String targetFile = null;
		
		if (!target.exists()) {
			File dir = new File(target.getAbsolutePath());
			dir.mkdir();
			this.log(target.getAbsolutePath() + " -> " + "criada pasta destino");
		}
		targetFiles = target.listFiles();
		 
		for (int i = 0; i < sourceFiles.length; i++) {
			targetFile = target.getAbsolutePath() + "\\" + sourceFiles[i].getName(); 
			if (sourceFiles[i].isDirectory()) {
				this.SynchronizeFiles(sourceFiles[i].getAbsolutePath(), targetFile);
			} else if (sourceFiles[i].isFile()) {
				if (!ExistsTargetFile(targetFiles, targetFile, sourceFiles[i].lastModified())) {
					this.CopyFile(sourceFiles[i].getAbsolutePath(), targetFile);
					this.log(targetFile + " -> " + "criado arquivo destino");
				}
			}
		}

	}
	
	public boolean ExistsTargetFile(File[] lista, String nome, long lastModified) {
		boolean retorno = false;
		for (int i = 0; i < lista.length; i++) {
			if (lista[i].getAbsolutePath().equalsIgnoreCase(nome)) {
				if (lista[i].lastModified() == lastModified) {
					retorno = true;					
				}
				break;
			}
		}
		return retorno;
	}
	
	public void CopyFile(String origem, String destino) {
	    try {
	        FileChannel srcChannel = new FileInputStream(origem).getChannel();
	        FileChannel dstChannel = new FileOutputStream(destino).getChannel();
	        dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
	        srcChannel.close();
	        dstChannel.close();
	        File source = new File(origem);
	        File target = new File(destino);
	        long modifiedTime = source.lastModified();
	        target.setLastModified(modifiedTime);
	    } catch (IOException e) {
	    	this.log(e.toString());
	    }
	}

}