Armazene-o em qualquer lugar em um local acessível, exceto na pasta de projeto do IDE, também conhecida como pasta de implantação do servidor, pelos motivos mencionados na resposta a Imagem carregada disponível apenas após a atualização da página :
As alterações na pasta do projeto do IDE não são refletidas imediatamente na pasta de trabalho do servidor. Há um tipo de trabalho em segundo plano no IDE, que cuida para que a pasta de trabalho do servidor seja sincronizada com as últimas atualizações (isso é, nos termos do IDE, chamado "publicação"). Essa é a principal causa do problema que você está vendo.
No código do mundo real, existem circunstâncias em que o armazenamento de arquivos carregados na pasta de implantação do aplicativo da web não funcionará. Alguns servidores (por padrão ou por configuração) não expandem o arquivo WAR implementado no sistema de arquivos do disco local, mas totalmente na memória. Você não pode criar novos arquivos na memória sem basicamente editar o arquivo WAR implementado e reimplementá-lo.
Mesmo quando o servidor expande o arquivo WAR implantado no sistema de arquivos do disco local, todos os arquivos recém-criados serão perdidos em uma reimplementação ou até em uma simples reinicialização, simplesmente porque esses novos arquivos não fazem parte do arquivo WAR original.
Realmente não importa para mim ou qualquer outra pessoa onde exatamente no sistema de arquivos do disco local ele será salvo, contanto que você não não nunca usar getRealPath()
método . Usando esse método é em qualquer caso alarmante.
O caminho para o local de armazenamento pode, por sua vez, ser definido de várias maneiras. Você tem que fazer tudo sozinho . Talvez seja aí que sua confusão é causada, porque de alguma forma você esperava que o servidor fizesse isso automaticamente. Por favor note que @MultipartConfig(location)
se não especificar o destino de upload final, mas o local de armazenamento temporário para o tamanho do arquivo do caso exceder o limite de armazenamento de memória.
Portanto, o caminho para o local de armazenamento final pode ser definido de uma das seguintes maneiras:
Codificado:
File uploads = new File("/path/to/uploads");
Variável de ambiente via SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argumento da VM durante a inicialização do servidor via -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
entrada de arquivo como upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
com nome upload.location
e valor /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Se houver, use o local fornecido pelo servidor, por exemplo, no JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
De qualquer forma, você pode facilmente referenciar e salvar o arquivo da seguinte maneira:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Ou, quando você deseja gerar automaticamente um nome de arquivo exclusivo para impedir que os usuários sobrescrevam arquivos existentes com coincidentemente o mesmo nome:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Como obter part
em JSP / Servlet é respondido em Como fazer upload de arquivos para o servidor usando JSP / Servlet? e como obter part
no JSF é respondido em Como fazer upload de arquivo usando o JSF 2.2 <h: inputFile>? Onde está o arquivo salvo?
Nota: não usePart#write()
, pois interpreta o caminho em relação ao local de armazenamento temporário definido em@MultipartConfig(location)
.
Veja também: