Struts 2 e Upload de Arquivos ( Arquivo não é salvo em disco )

Opa pessoal beleza?

Estou tendo problemas ao tentar enviar meus arquivos para o servidor.

vou tentar me explicar:

Possuo uma página JSP que tem o seguinte trecho de código:

[code]<s:form action="/painel/upload!send.java" enctype=“multipart/form-data” method=“post”>

Nome do Arquivo: &lt;s:textfield id="arquivo.nome" name="arquivo.nome"&gt;&lt;/s:textfield&gt;
Arquivo: &lt;s:file name="arquivo.upload"&gt;&lt;/s:file&gt;
Ano: &lt;s:textfield id="arquivo.ano" name="arquivo.ano"&gt;&lt;/s:textfield&gt;
Semestre: &lt;s:textfield id="arquivo.semestre" name="arquivo.semestre"&gt;&lt;/s:textfield&gt;
Matéria: &lt;sx:autocompleter id="materia" name="materia" value="materia" listKey="nome" list="disciplinas" listValue="nome"  /&gt;

&lt;s:submit&gt;&lt;/s:submit&gt;

</s:form>[/code]

Na minha Action tenho o uma variavel de instância chamada Arquivo que recebe os parâmetros.

dentro de arquivo tenho 3 propriedades que o Struts seta para mim:

[code] @Transient
private File upload;

@Transient
private String uploadFileName; 

@Transient
private String uploadContentType;[/code]

Continuando na action tenho um método chamado" send " que pega esse arquivo e salva ele em disco

Abaixo o método:

[code]public String send(){

	ArquivoUtil.saveFile(arquivo);
	//arquivoDao.save(arquivo);

	disciplinas = materiaService.getAll();
	return &quot;adicionarArquivo&quot;;
}[/code]

Esse método send faz uma chamada à saveFile que segue abaixo:

[code]public static String saveFile(Arquivo arquivo) {
ServletContext sContext = ServletActionContext.getServletContext();
String diretorio = sContext.getRealPath("/arquivos");
String fileName = arquivo.getNome();

	if(arquivo.getUploadContentType().contains(&quot;powerpoint&quot;)){
		fileName += &quot;.ppt&quot;;
	}else if (arquivo.getUploadContentType().contains(&quot;word&quot;)){
		fileName += &quot;.doc&quot;;
	}else if((arquivo.getUploadContentType().contains(&quot;pdf&quot;))){
		fileName += &quot;.pdf&quot;;
	}else{
		fileName += &quot;.txt&quot;;
	}	

	try {

		File file = new File(diretorio + &quot;\\&quot; + fileName); // Caminho que quero salvar
		byte[] tempBytes = getBytesFromFile(arquivo.getUpload()); // Bytes do Arquivo temporário
		
		FileOutputStream ouputStream = new FileOutputStream( file ); 
                    ouputStream.write(tempBytes, 0, tempBytes.length);  
                    ouputStream.flush();  
                    ouputStream.close();  
        
		return fileName;
	} catch (IOException e) {
		return fileName;
	}
}

public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);

  
    long length = file.length();

    if (length &gt; Integer.MAX_VALUE) {
        // File is too large
    }


    byte[] bytes = new byte[(int)length];


    int offset = 0;
    int numRead = 0;
    while (offset &lt; bytes.length
           && (numRead=is.read(bytes, offset, bytes.length-offset)) &gt;= 0) {
        offset += numRead;
    }

  
    if (offset &lt; bytes.length) {
        throw new IOException(&quot;Could not completely read file &quot;+file.getName());
    }


    is.close();
    return bytes;
}

[/code]

Quando olho na pasta arquivos/nome.extensao a pasta está vazia, alguem pode me ajudar?agradeço desde já

Gabriel, seu código tem vários errinhos…

Pq vc cria um File na linha 21 e não o usa na linha 41? Na linha 41 vc cria outro File com outro caminho. O arquivo realmente não vai ficar onde vc está esperando (caso seja o caminho do File da linha 21).

Pq vc chama DUAS vezes o método para ler os bytes do arquivo???
Pq ao ler os bytes, você já não vai gravando na saida?
O método getUpload de Arquivo é um File? Então vc já está criando um arquivo em algum lugar.

Enfim, acho que você precisa repensar um pouco o que você fez. Parece que tem um monte de “copy and paste” no seu código.

[]´s

Realmente você tem razão, estava com pressa e nem percebi estou corrigindo mais fiz várias tentativas e não tive nenhum resultado.

Vou explicar o que quero e to tentando fazer:

o arquivo.getUpload() me retorna um File temporário.

Então pego os bytes dele e informo para o outputStream e um outro File(fileName) é o File com o caminho onde eu quero gravar.

A ideia seria pegar os bytes do temporário e escrever no que eu quero gravar em disco.

Obrigado.