Upload Files JSF

Bom dia pessoal, gostaria de algumas dicas, a respeito de UPLOAD de arquivos para o servidor, estou trabalhando com JSF
e preciso criar uma ficha de inscrição, no qual o usuário que está se cadastrando envie um arquivo para o servidor, através
do formulario.
Qual a maneira de fazer isso? Existe algo pronto, ou é necessário implementar?

Obs: Os arquivos podem ser VIDEOS, PDF, DOC.
Obrigado.

use o FileUpload do primeFaces

òtima sugestão,
qualquer dúvida use o showcase do prime
Link: http://www.primefaces.org/showcase/ui/fileUploadSingle.jsf

Bom, estou tentando usa-lo, estou com o seguinte problema para imports dessa linha:

private Logger logger = LoggerFactory.getLogger(FileUploadController.class);

quando eu coloco os import que não ocorrem erros , o netbeans não consegue executar o codigo, alguem poderia verificar isso para mim?
obrigado.

O erro que ocorre é esse:

Iniciando GlassFish Server 3
GlassFish Server 3 está em execução.
Deployment localizado em C:\Users\User\Documents\NetBeansProjects\FileUploadJSF\build\web
Initializing...
deploy?path=C:\Users\User\Documents\NetBeansProjects\FileUploadJSF\build\web&name=FileUploadJSF&force=true falhou em GlassFish Server 3
C:\Users\User\Documents\NetBeansProjects\FileUploadJSF\nbproject\build-impl.xml:686: O módulo não foi implementado.
FALHA NA CONSTRUÇÃO (tempo total: 35 segundos)

Pessoal consegui sanar meu problema…
Agora tenho uma duvida:
Onde coloco o caminho onde esse arquivo será salvo:
Eis o código do FileUploaderJSF:

 public void handleFileUpload(FileUploadEvent event) {
        logger.log(Level.INFO, "Uploaded: {0}", event.getFile().getFileName());

        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

Aonde você quiser, vc decide a pasta aonde será salva

1-) Crie um File aonde vc vai colocar o arquivo.
2-) Pegue o inputStrean e salva na pasta criada

Ex:

public void upload(FileUploadEvent event) {
        UploadedFile uf = event.getFile();
        String nomeArquivo = uf.getFileName();
        File f = new File("C:\\Documents and Settings\\erick.macedo\\Meus documentos\\" + nomeArquivo);
        OutputStream os = null;
        InputStream is = null;
        try {
            is = uf.getInputstream();
            byte[] b = new byte[is.available()];
            os = new FileOutputStream(f);
            while (is.read(b) > 0) {
                os.write(b);
            }
            
            FacesMessage msg = new FacesMessage("Upload realizado com Sucesso!", event.getFile().getFileName());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (IOException ex) {
            Logger.getLogger(MbUpload.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                os.flush();
                os.close();
                is.close();
            } catch (IOException ex) {
                Logger.getLogger(MbUpload.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
      }    

Amigo normalmente eu uso o Seam segue em exemplo ai abaixo.

<s:fileUpload  id="anexo" accept="image/jpg,image/jpeg,application/pdf"  fileSize="#{anexosAction.fileSize}"  data="#{anexosAction.file}" fileName="#{anexosAction.fileName}" alt="Endereço do arquivo no computador" title="Endereço do arquivo no computador"/>

Segue alguns fragmentos do codigo da action necessário para a inclusão

[code]private Integer fileSize;

private String fileName;

private byte[] file;

private String descricao;


public void incluirAnexo(){
	if (this.validarAnexo()){
		AnexoTransacaoComplemento anexoTransacao = new AnexoTransacaoComplemento();
		anexoTransacao.setArquivo(file);
		anexoTransacao.setNomeArquivo(fileName);
		anexoTransacao.setTipoArquivo(tipoArquivo);
		anexoTransacao.setDescricao(descricao);
		anexoTransacao.setTipoAnexoTransacao(TipoAnexoTransacao.A);
		anexoTransacao.setSituacaoRegistroPublico(SituacaoRegistroPublico.NAO);
		anexoTransacao.setSituacaoRegistro(SituacaoRegistro.ATIVO);
		anexoTransacao.setTipoAnexo(tipoAnexo);
		anexoTransacao.setDataEnvio(Calendar.getInstance().getTime());
		transacaoCorrente.getAnexos().add(anexoTransacao);
		anexoTransacao.setTransacao(transacaoCorrente);
		resetValues();
	}
}


private void resetValues(){
	file = null;
	fileName = null;
	tipoAnexo = null;
	descricao = null;
	fileName = null;	
}[/code]

espero ter ajudado.