Como fornecer um caminho relativo na classe File para fazer upload de qualquer arquivo? [duplicado

Esta pergunta já tem uma resposta aqui:

aneira recomendada de salvar arquivos enviados em um aplicativo de servl 2 respostas

Estou carregando um arquivo, para o qual desejo fornecer um caminho relativo, porque o programa deve funcionar no linux e no Windows en

Isso é o que estou usando para fazer upload

realPath = getServletContext().getRealPath(/files);
destinationDir = new File(realPath);
if(!item.isFormField())
                {
                    File file = new File(destinationDir,item.getName());

                    item.write(file);
}

Qualquer outro meio de fornecer diretamente o caminho relativo aqui

File file = new File(destinationDir,item.getName());

questionAnswers(2)

QuestionSolution

Eu quero fornecer um caminho relativo

Nunca faça isso em um aplicativo da web. O diretório de trabalho não é controlável de dentro do códig

porque o programa deve funcionar tanto no linux quanto no windows en

Apenas use"/path/to/uploaded/files". Funciona igualmente nos dois ambientes. No Windows, ele será apenas o mesmo disco em que o servidor é executad

File file = new File("/path/to/uploaded/files", filename);
// ...

Isto é o que estou usando para fazer upload

 realPath = getServletContext().getRealPath(/files);
 destinationDir = new File(realPath);

Você não deve armazenar os arquivos no conteúdo da web. Isso falhará quando o WAR não for expandido e, mesmo quando for, todos os arquivos serão perdidos sempre que você reimplementar o WAR. Armazene-os fora do WAR em um local absoluto, por ex./path/to/uploaded/files como sugerido antes.

Veja tambémgetResourceAsStream () vs FileInputStreamelhor localização para upload de arquivoaneira mais simples de fornecer dados estáticos de fora do servidor de aplicativos em um aplicativo da Web Ja
 BalusC19 de mai de 2011 15:43
Não definitivamente NÃO. Os arquivos serão perdidos sempre que você reimplementar o WAR. Use um caminho fixo. Veja também os links "Consulte também" na minha resposta.
 abi196419 de mai de 2011 15:41
@ BalusC: Então substituireidestinationDir com/files e deve funcionar?
 BalusC19 de mai de 2011 15:42
Sim, será/files no linux eC:\files no Windows (supondo que o servidor seja executado em C:
 abi196419 de mai de 2011 15:42
Também precisogetServletContext().getRealPath(/files);? nesta situação
 abi196419 de mai de 2011 15:44
Acho que você interpretou mal, não estou verificando janelas ou caixas de linux, se eu simplesmente substituirdestinationDir com/files funcionará para ambas as plataforma

Como BalusC salienta, você não deseja salvar arquivos em um destino encontrado com getRealPath. Esses arquivos não apenas serão apagados quando você reimplementar, mas também estarão disponíveis para download por qualquer usuário que possa acessar seu site, o que, dependendo do que você está fazendo, pode ser um sério problema de segurança.

Quando me deparo com esse problema, normalmente crio um arquivo de propriedades e coloco o diretório no qual salvar os arquivos no arquivo de propriedades. Então, posso ter um caminho diferente para Linux e Windows, ou para o servidor A e o servidor B. Pode funcionar para você apenas inventar um caminho e codificá-lo, mas geralmente acho que preciso de caminhos diferentes em servidores diferentes. Como no meu projeto atual, temos três instâncias do Tomcat em execução na mesma caixa física para diferentes estágios de teste. Não queremos que os arquivos para os quais eles escrevem vão para o mesmo diretório: cada um deve ter o se

yourAnswerToTheQuestion