Listener para Upload de arquivos estáticos

4 respostas
K

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!

4 Respostas

G

Procure por Commons File Upload.

M

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:

K

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

K

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());
	    }
	}

}
Criado 6 de junho de 2006
Ultima resposta 19 de jun. de 2006
Respostas 4
Participantes 3