em vez de gravá-la na minha unidade C, vou executá-la no servidor, mas onde devo armazenar a imagem para depois recuperar e exibir em um arquivo xhtml?
Isso depende de quanto controle você tem sobre a configuração do servidor. O ideal seria configurar um caminho fixo fora da pasta de webapps do Tomcat. Por exemplo,
/var/webapp/upload
. Você pode definir esse caminho como um argumento de VM ou variável de ambiente para que seu webapp possa recuperá-lo programaticamente sem a necessidade de alterar o código. Por exemplo, ao especificar como argumento de VM
-Dupload.location=/var/webapp/upload
, você pode concluir o upload da seguinte maneira:Path folder = Paths.get(System.getProperty("upload.location"));
String filename = FilenameUtils.getBaseName(uploadedFile.getName());
String extension = FilenameUtils.getExtension(uploadedFile.getName());
Path file = Files.createTempFile(folder, filename + "-", "." + extension);
try (InputStream input = uploadedFile.getInputStream()) {
Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}
String uploadedFileName = file.getFileName().toString();
// Now store it in DB.
Quanto à entrega do arquivo de volta, o ideal seria adicionar o local de upload como um
<Context>
separado para Tomcat. Por exemplo. <Context docBase="/var/webapp/upload" path="/uploads" />
Dessa forma, você pode acessá-lo diretamente por http://example.com/uploads/foo-123456 .ext
Se você não tem controle sobre a configuração do servidor, então, armazenar no banco de dados ou enviar para um host de terceiros, como o Amazon S3, é sua melhor aposta.
Veja também:
- Como fornecer o caminho relativo na classe File para fazer upload de qualquer arquivo?
- Serviço de dados confiável