Eu li aqui que não se deve salvar o arquivo no servidor, pois ele não é portátil, transacional e requer parâmetros externos. No entanto, considerando que preciso de uma solução tmp para o tomcat (7) e que tenho controle (relativo) sobre a máquina do servidor, quero saber:
Qual é o melhor local para salvar o arquivo? Devo salvá-lo
/WEB-INF/uploads
(desaconselhado aqui ) ou em algum lugar abaixo$CATALINA_BASE
(ver aqui ) ou ...? O tutorial do JavaEE 6 obtém o caminho do usuário (: wtf :). NB: O arquivo não deve ser baixado por qualquer meio.Devo configurar um parâmetro de configuração conforme detalhado aqui ? Eu apreciaria algum código (prefiro dar a ele um caminho relativo - pelo menos é portátil para o Tomcat) -
Part.write()
parece promissor - mas aparentemente precisa de um caminho absolutoEu estaria interessado em uma exposição das desvantagens dessa abordagem versus um repositório de banco de dados / JCR
Infelizmente, o FileServlet da @BalusC se concentra no download de arquivos, enquanto sua resposta no upload de arquivos ignora a parte de onde salvar o arquivo.
Uma solução facilmente conversível para usar uma implementação de DB ou JCR (como jackrabbit ) seria preferível.
fonte
Respostas:
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 :
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:
Variável de ambiente via
SET UPLOAD_LOCATION=/path/to/uploads
:Argumento da VM durante a inicialização do servidor via
-Dupload.location="/path/to/uploads"
:*.properties
entrada de arquivo comoupload.location=/path/to/uploads
:web.xml
<context-param>
com nomeupload.location
e valor/path/to/uploads
:Se houver, use o local fornecido pelo servidor, por exemplo, no JBoss AS / WildFly :
De qualquer forma, você pode facilmente referenciar e salvar o arquivo da seguinte maneira:
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:
Como obter
part
em JSP / Servlet é respondido em Como fazer upload de arquivos para o servidor usando JSP / Servlet? e como obterpart
no JSF é respondido em Como fazer upload de arquivo usando o JSF 2.2 <h: inputFile>? Onde está o arquivo salvo?Nota: não use
Part#write()
, pois interpreta o caminho em relação ao local de armazenamento temporário definido em@MultipartConfig(location)
.Veja também:
fonte
@MultipartConfig(location)
especifica o temporária localização storge qual o servidor deve usar quando o tamanho do arquivo exceder o limite de armazenamento de memória, e não o local de armazenamento permanente, onde você iria em última análise, como se para ser armazenado. O valor padrão é o caminho, conforme identificado pelajava.io.tmpdir
propriedade do sistema. Consulte também esta resposta relacionada a uma tentativa falha do JSF: stackoverflow.com/questions/18478154/…Part.write
>> Isso permite que uma implementação específica use, por exemplo, renomear arquivos, sempre que possível, em vez de copiar todos os dados subjacentes, obtendo assim um benefício significativo de desempenho em conjunto com alguns método de dizer alguma apache lib desconhecido "cut" (vs cópia) me pouparia o trabalho de escrever os bytes mim mesmo - e recriando um arquivo já existe (ver também aqui )Part#write()
. Eu atualizei a resposta com ele."jboss.server.data.dir"
?Postei minha maneira final de fazê-lo com base na resposta aceita:
Onde :
e o /WEB-INF/app.properties:
HTH e se você encontrar um bug, me avise
fonte