Estou tentando recuperar o diretório completo de um arquivo selecionado do computador de um usuário do sistema e para isso tentar um utilizar o seguinte comando.
variaveltipoField.getAbsolutePath();
Só que isso me retorna a system32, eu preciso ter um retorno tipo C:\\Documents\Arquivo.pdf
Caso o caminho completo do arquivo seja selecionado pelo usuário numa interface gráfica, Com a biblioteca JavaFx você pode usar o componente FileChooser, por exemplo:
FileChooser fc = new FileChooser();
File fileSelecionado = fc.showDialog( primaryStage );
if ( fileSelecionado != null )
{
System.out.println( fileSelecionado );
}
Se usar Swing, use a classe JFileChooser.
Agora se você quer passar o caminho por meio do código Java sem interface gráfica pode ser assim:
Eu armazeno o arquivo em uma váriavel String, só que pra salvar no banco eu passo o diretório e transformo no array de bytes, o problema tá em receber o diretório, tentei alguma opções:
//variavel String
System.out.println("Arquivo------" + a.getArquivorecebido());
File filerecebido = new File(a.getArquivorecebido());
//tentativa de pegar o diretório
String caminho = filerecebido.getPath();
String caminho2 = filerecebido.getCanonicalPath();
String caminho3 = filerecebido.getName();
Retornos em tela:
Arquivo------org.primefaces.model.UploadedFileWrapper@6bb9768e
File------org.primefaces.model.UploadedFileWrapper@6bb9768e
Caminho---org.primefaces.model.UploadedFileWrapper@6bb9768e
Caminho2---C:\Windows\System32\org.primefaces.model.UploadedFileWrapper@6bb9768e
Caminho3---org.primefaces.model.UploadedFileWrapper@6bb9768e
Se eu passar o diretório na instância do File, funciona perfeitamente File filerecebido = new File("C:\\Documents\Arquivo.pdf");
Não é possível transformar um diretório em um array de bytes.
Você lê os bytes do arquivo recebido, através de um InputStream e aí salva os bytes dele no banco.
Esse variável que está mapeada ali, é uma String, que na classe está assim:
private String arquivorecebido;
Já no meu DAO eu faço assim:
File file = new File("C:\\Downloads\\Documento.pdf");
InputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
E o valor que é enviado pro meu banco é esse: "%PDF-1.7\0151 0 obj\015<</Type /XObject /Subtype /Image /Name /Im1 /Width 1654 /Height 2338 /Length 251653/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter [ /DCTDecode ] >> stream\015\377\330\377\340\000\020JFIF\000\001\001\001\000\310\000\310\000\000\37 (...)"
Eu ainda não tentei recuperar o arquivo pra ver se ele salvou certo, mas acredito que sim, meu maior problema é pegar o diretório, ali no exemplo eu passo ele como parâmetro, o que eu preciso é pegar nofileuploader
Estou quase lá, eu mudei um pouco minha estratégia, estou usando uma variável do tipo Part e no bean eu faço assim:
try (InputStream is = arquivo.getInputStream()) {
String filename = arquivo.getSubmittedFileName();
Files.copy(is, new File("C:\\Users\\meuuser\\Desktop\\documentos_alunos","123.456.789-20_"+filename).toPath());
} catch (IOException ex) {
ex.printStackTrace();
}
Na terceira linha eu eu copio o arquivo pro diretorio e funciona perfeitamente, eu só preciso pegar o caminho informado nessa linha e salvar em uma String, alguma ideia de como eu posso fazer ?