BlogNotFoundException

Java, Linux, Open Source, etc...


Upload com WebWork

Tenho visto muita gente com dificuldade em criar um upload no WebWork. Nesse post demonstrarei como é bastante simples criar um upload utilizando o suporte ao Commons FileUpload do WebWork.

Primeiro passo: criar a action
public class UploadAction extends ActionSupport {

private File file;
private String contentType;
private String filename;

public void setUpload(File file) {
this.file = file;
}
public void setUploadContentType(String contentType) {
this.contentType = contentType;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}

public String execute() throws Exception {
if (file == null) {
return INPUT;
}
}

}
Na action precisamos apenas criar os seguintes atributos: file, contentType e fileName para que o WebWork identifique que será realizado o upload.

Segundo passo: configurar o arquivo webwork.properties

webwork.multipart.parser=jakarta
webwork.multipart.saveDir=C:/uploads/

Ao configurar o parser como jakarta, definimos que o upload será feito através do Commons FileUpload .

Terceiro passo: criar o formulário de upload
<ww:form  method="POST" action="upload.action" enctype="multipart/form-data">
   <ww:file name="upload"/>
   <ww:submit>
</ww:form>
Para construir o formulário, utilizamos a tag <ww:form>. Para gerar o campo de upload,
 utilizamos a tag <ww:file> e para submeter o formulário, utilizamos a tag <ww:submit>.

Quarto passo: configurar a action no arquivo xwork.xml
<action name="upload" class="br.com.action.UploadAction">
     <interceptor-ref name="fileUpload"/>
     <interceptor-ref name="basicStack"/>
     <result name="success">success_upload.jsp</result>
     <result name="input">input_upload.jsp</result>
</action>
Para configurarmos o upload, basta referenciar o interceptor fileUpload na declaração da action.

A partir dessa configuração poderíamos realizar o upload sem grandes problemas, só que o interceptor fileUpload realiza uma limpeza nos arquivos e por consequência todos os arquivos que sofreram upload serão excluídos. Para contornar isso, podemos copiar o upload para um diretório específico.

Retire a seguinte linha do arquivo webwork.properties:

webwork.multipart.saveDir=C:/uploads/

E crie o seguinte método que é responsável por copiar o arquivo para um diretório:
public void copyFile(File in, File out) throws IOException {
FileChannel sourceChannel = new FileInputStream(in).getChannel();
FileChannel destinationChannel = new FileOutputStream(out).getChannel();
sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);
sourceChannel.close();
destinationChannel.close();
}
E para utilizar esse método na action:
public class UploadAction extends ActionSupport {

private File file;
private String contentType;
private String filename;

public void setUpload(File file) {
this.file = file;
}
public void setUploadContentType(String contentType) {
this.contentType = contentType;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}

public String execute() throws Exception {
if (file == null) {
return INPUT;
}
copyFile(file, new File("C:/uploads/" + filename));
return SUCCESS;
}

public static void copyFile(File in, File out) throws IOException {
FileChannel sourceChannel = new FileInputStream(in).getChannel();
FileChannel destinationChannel = new FileOutputStream(out).getChannel();
sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);
sourceChannel.close();
destinationChannel.close();
}

}
Não se esqueça de colocar o jar do Commons FileUpload no classpath !

5 Responses to “Upload com WebWork”

  1. # Anonymous Anônimo

    Olá Guilherme... gostei bastante do tutorial de Upload de Arquivos com WW... Eu estava com dificuldades sobre o assunto...
    Obrigado  

  2. # Blogger Guilherme

    Valeu! Aguarde mais tutoriais sobre o WW.  

  3. # Anonymous Anônimo

    Ola Guilherme, gostei do tutorial ajudou um pouco, só que o File sempre está vindo como null.
    Você sabe pq?  

  4. # Anonymous Anônimo

    muito bom, segui o tutorial so q utilizando struts 2 e funcionou perfeitamente.  

  5. # Blogger Unknown

    Cara, valeu mesmo!  

Postar um comentário