Como salvar o arquivo enviado no JSF

Estou fazendo upload de um arquivo no JSF. Estou usando o para isso, mas a mesma pergunta é aplicável em, por exemplo, PrimeFaces

e JSF 2.2 .

Eu tenho o seguinte código de bean de apoio:

 private UploadedFile uploadedFile; // +getter+setter public String save() throws IOException { String name = uploadedFile.getName(); System.out.println("File name: " + name); String type = uploadedFile.getContentType(); System.out.println("File type: " + type); long size = uploadedFile.getSize(); System.out.println("File size: " + size); InputStream stream = uploadedFile.getInputStream(); byte[] buffer = new byte[(int) size]; stream.read(buffer, 0, (int) size); stream.close(); } 

Eu sou capaz de obter o nome do arquivo, tipo e tamanho, mas não consigo salvar este arquivo em um caminho específico. Não consigo descobrir a maneira correta de salvar o arquivo enviado. Como posso conseguir isso?

O método getInputStream() do arquivo enviado representa o conteúdo do arquivo.

 InputStream input = uploadedFile.getInputStream(); 

Você precisa copiá-lo para um arquivo. Você deve primeiro preparar uma pasta no sistema de arquivos do disco local, onde os arquivos carregados devem ser armazenados. Por exemplo, /path/to/uploads (no Windows, isso seria no mesmo disco onde o servidor é executado). Observe que você absolutamente não deve armazenar os arquivos na pasta WAR expandida usando um caminho relativo ou getRealPath() pelas razões mencionadas aqui Imagem getRealPath() somente após a atualização da página .

Então, você precisa gerar automaticamente o nome do arquivo. Caso contrário, quando outra pessoa fizer upload de um arquivo coincidentemente com o mesmo nome posteriormente, ele será sobrescrito. Você pode usar o recurso Files#createTempFile() para obter um nome de arquivo autogerado.

 Path folder = Paths.get("/path/to/uploads"); String filename = FilenameUtils.getBaseName(uploadedFile.getName()); String extension = FilenameUtils.getExtension(uploadedFile.getName()); Path file = Files.createTempFile(folder, filename + "-", "." + extension); 

O caminho para uploads poderia, se necessário, ser parametrizado com base em uma das várias maneiras mostradas nesta session de perguntas e respostas: A maneira recomendada de salvar arquivos carregados em um aplicativo de servlet . O FilenameUtils faz parte do Apache Commons IO que você já deve ter em seu caminho de class, pois é uma dependência do componente de upload de arquivo Tomahawk.

Por fim, basta transmitir o arquivo carregado para esse arquivo (assumindo o Java 7):

 try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } System.out.println("Uploaded file successfully saved in " + file); 

Então, para fazer o download, é mais fácil registrar /path/to/uploads como um novo contexto de webapp ou um host virtual para que todos esses arquivos estejam disponíveis por um URL. Consulte também Carregar imagens de fora da pasta webapps / webcontext / deploy usando a tag ou .

PrimeFaces usa dois decodificadores de upload de arquivos para upload de conteúdo de p: fileupload

  1. NativeFileUploadDecoder
  2. CommonsFileUploadDecoder

NativeFileUploadDecoder é o decodificador de upload padrão e requer o recipiente de servlet 3.0. Portanto, se seu contêiner de servlet for menor que 3, ele não funcionará com você. Além disso, alguns servidores de aplicativos restringem o uso de conteúdo de várias partes

Então, se você tiver um problema com o decodificador de upload nativo por qualquer motivo, você tem que usar o outro decodificador que é “CommonsFileUploadDecoder”

CommonsFileUploadDecoder depende da biblioteca comum do Apache, então você tem que colocar os jars commons-io em seu class-path, a versão depende da versão do seu primefaces, mas 1.3 e 2.2 respectivamente funcionam para mim.

para usar o CommonsFileUploadDecoder você tem que usar o filtro

  PrimeFaces FileUpload Filter org.primefaces.webapp.filter.FileUploadFilter   PrimeFaces FileUpload Filter Faces Servlet  

espere o filtro só não vai funcionar porque dentro do filtro ele checa sobre o uploader se ele não é fornecido e ele detecta pelo menos o JSF 2.2 então ele irá ignorar o pedido para o decodificador padrão “Native” e então ele não funcionará para o seu também

para forçar o filtro a usar o decodificador comum, você deve colocar o seguinte parâmetro de contexto em seu web.xml

  primefaces.UPLOADER commons