No sistema que estou trabalhando, o usuário tem uma pasta no servidor, onde ele pode inserir arquivos como fotos, certidões, documentos, etc. Para isto, foi preciso descobrir como fazer um upload através do Struts 2.
Vou escrever a receita de bolo aqui. Espero não ter esquecido nada.
1° Colocar no seu form o elemento input file
<s:file name="upload" id="upload" label="Arquivo:"/>
ps.: Não tente estilizar o botão de upload que aparece, nem mudar o texto do botão. Primeiro porque vai te dar bastante trabalho e segundo que para fazer isso só usando gambiarra.
2° Adicionar um atributo no seu form
<s:form action="minhaAction.action" method="post" enctype="multipart/form-data">
3° Adicionar alguns atributos na sua action
/**
* O arquivo a ser feito upload.
*/
private File upload;
/**
* O nome do arquivo a ser feito upload.
*/
private String uploadFileName;
/**
* O tipo de arquivo que vem sendo feito upload.
*/
private String uploadContentType;
- Gere os getters e setters para estes atributos.
4° Criar um método para subir o arquivo para o servidor
/**
* Copia do arquivo da pessoa para a máquina de destino.
*
* @param in
* @param out
* @throws IOException
*/
private void copiarArquivo(File in, File out)
{
try
{
// Copia o arquivo para o servidor.
FileChannel sourceChannel = new FileInputStream(in).getChannel();
FileChannel destinationChannel = new FileOutputStream(out)
.getChannel();
sourceChannel.transferTo(0, sourceChannel.size(),
destinationChannel);
// Fecha os canais de transferência de conteúdo.
sourceChannel.close();
destinationChannel.close();
}
catch (IOException ex)
{
// Erro ao anexar arquivo.
ex.printStackTrace();
}
}
5° Chamar o método criado anteriormente dentro da action envolvida
String pathArquivoSaida = dirPastaUsuario.getAbsolutePath() + File.separator + getUploadFileName();
File arquivoSaida = new File(pathArquivoSaida);
if (!arquivoSaida.exists())
{
arquivoSaida.createNewFile();
}
// Solicita a cópia do arquivo para o servidor.
this.copiarArquivo(getUpload(), arquivoSaida);
6° Fazer download de algumas bibliotecas para upload
- commons-fileupload.jar
- commons-io.jar
Adicione-as no seu projeto.
7° Editar o properties do struts
struts.multipart.parser=org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest
struts.multipart.maxSize=2097152
struts.multipart.saveDir=C:\uploads\
8° Editar o struts.xml
<action name="anexarDocumento" class="actions.AnexoAction" method="anexar">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
<result>anexo.jsp</result>
</action>
Meio complicadinho, mas é isso aí. Espero ter ajudado. Qualquer dúvida, mandem-me um comentário.