Eu já vi algumas sugestões, como ter o diretório de imagens como um link simbólico apontando para um diretório fora do contêiner da web, mas será que essa abordagem funcionará nos ambientes Windows e * nix?
Se você seguir as regras do caminho do sistema de arquivos * nix (ou seja, você usa barras invertidas exclusivamente como em /path/to/files
), ele também funcionará no Windows sem a necessidade de mexer nas File.separator
concatenações feias de strings. No entanto, ele seria verificado apenas no mesmo disco de trabalho a partir de onde esse comando foi chamado. Então, se Tomcat é, por exemplo, instalado em C:
seguida, o /path/to/files
que realmente apontam para C:\path\to\files
.
Se todos os arquivos estão localizados fora do aplicativo da Web e você deseja que o Tomcat os DefaultServlet
manipule, tudo o que você basicamente precisa fazer no Tomcat é adicionar o seguinte elemento Context à tag /conf/server.xml
inside <Host>
:
<Context docBase="/path/to/files" path="/files" />
Dessa forma, eles estarão acessíveis através http://example.com/files/...
. O exemplo de configuração do GlassFish / Payara pode ser encontrado aqui e o exemplo de configuração do WildFly pode ser encontrado aqui .
Se você quer ter controle sobre a leitura / escrita de arquivos si mesmo, então você precisa criar um Servlet
para isto que, basicamente, apenas recebe uma InputStream
do arquivo no sabor de, por exemplo, FileInputStream
e escreve-o para o OutputStream
do HttpServletResponse
.
Na resposta, você deve definir o Content-Type
cabeçalho para que o cliente saiba qual aplicativo associar ao arquivo fornecido. E você deve definir o Content-Length
cabeçalho para que o cliente possa calcular o progresso do download, caso contrário, será desconhecido. E, você deve definir o Content-Disposition
cabeçalho como attachment
se desejar uma caixa de diálogo Salvar como , caso contrário, o cliente tentará exibi-lo em linha. Por fim, basta escrever o conteúdo do arquivo no fluxo de saída da resposta.
Aqui está um exemplo básico desse servlet:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
Quando mapeado em um url-pattern
de, por exemplo /files/*
, você pode chamá-lo por http://example.com/files/image.png
. Dessa forma, você pode ter mais controle sobre as solicitações do que as solicitações DefaultServlet
, como fornecer uma imagem padrão ( if (!file.exists()) file = new File("/path/to/files", "404.gif")
ou seja ). Também request.getPathInfo()
é preferível usar o acima, request.getParameter()
porque é mais amigável ao SEO e, caso contrário, o IE não escolherá o nome do arquivo correto durante o Salvar como .
Você pode reutilizar a mesma lógica para servir arquivos do banco de dados. Simplesmente substitua new FileInputStream()
por ResultSet#getInputStream()
.
Espero que isto ajude.
Veja também:
<Context docBase="/path/to/images" path="/images" />
no Windows, mas obtendo o caminho relativo à pasta webapps:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
quando estiver fazendohttp://localhost:8080/images/
:, MAS um arquivo específico de undertmp
works:http://localhost:8080/images/Tulips.jpg
está OKVocê pode fazer isso colocando suas imagens em um caminho fixo (por exemplo: / var / images ou c: \ images), adicione uma configuração nas configurações do aplicativo (representadas no meu exemplo pela Settings.class) e carregue-as assim, em um
HttpServlet
dos seus:Ou se você deseja manipular a imagem:
então o código html seria
<img src="imageServlet?imageName=myimage.png" />
Obviamente, você deve pensar em fornecer diferentes tipos de conteúdo - "image / jpeg", por exemplo, com base na extensão do arquivo. Além disso, você deve fornecer algum cache.
Além disso, você poderia usar esse servlet para a qualidade rescaling de suas imagens, fornecendo parâmetros largura e altura como argumentos, e usando
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
), considerando o desempenho, é claro.fonte
Adicione ao server.xml:
Ative o parâmetro de listagem de arquivos dir no web.xml:
fonte
Requisito: Acessando os recursos estáticos (imagens / vídeos. Etc.) de fora do diretório WEBROOT ou do disco local
Etapa 1:
Crie uma pasta em aplicativos da web do servidor tomcat., Digamos que o nome da pasta seja myproj
Etapa 2:
em myproj, crie uma pasta WEB-INF e crie um web.xml simples
código em web.xml
Estrutura de diretórios para as duas etapas acima
Etapa 3:
Agora crie um arquivo xml com o nome myproj.xml no seguinte local
CÓDIGO em myproj.xml:
Passo 4:
4 A) Agora, crie uma pasta com o nome myproj em Mi unidade de disco rígido e criar um novo
pasta com imagens de nome e coloque algumas imagens na pasta de imagens
(e:myproj\images\)
Suponhamos que myfoto.jpg seja colocado em
e:\myproj\images\myfoto.jpg
4 B) Agora crie uma pasta com o nome WEB-INF
e:\myproj\WEB-INF
e crie um web.xml na pasta WEB-INFCódigo no web.xml
Etapa 5:
agora crie um documento .html com o nome index.html e coloque em e: \ myproj
CODE sob index.html Bem-vindo ao Myproj
A estrutura de diretórios para as etapas 4 e 5 acima é a seguinte
Etapa 6:
Agora inicie o servidor apache tomcat
Etapa 7:
abra o navegador e digite o URL da seguinte maneira
u exibe o conteúdo fornecido em index.html
Etapa 8:
Para acessar as imagens no disco rígido local (fora do webroot)
fonte
Esta é a história do meu local de trabalho:
- Tentamos fazer upload de imagens multiplicadas e arquivos de documentos usando o Struts 1 e o Tomcat 7.x.
- Tentamos escrever arquivos enviados para o sistema de arquivos, nome do arquivo e caminho completo para os registros do banco de dados.
- Tentamos separar pastas de arquivos fora do diretório de aplicativos da web . (*)
A solução abaixo é bastante simples, eficaz para o requisito (*):
No arquivo
META-INF/context.xml
arquivo com o seguinte conteúdo: (Exemplo, meu aplicativo é executado emhttp://localhost:8080/ABC
, meu aplicativo / projeto é nomeadoABC
). (este também é o conteúdo completo do arquivocontext.xml
)(funciona com o Tomcat versão 7 ou posterior)
Resultado: fomos criados 2 alias. Por exemplo, salvamos imagens em:
D:\images\foo.jpg
e visualizamos no link ou usando a tag de imagem:ou
(Eu uso o Netbeans 7.x, o Netbeans parece criar arquivo automaticamente
WEB-INF\context.xml
)fonte
Se você decidir expedição para
FileServlet
, em seguida, você também vai precisarallowLinking="true"
decontext.xml
, a fim de permitirFileServlet
a atravessar os links simbólicos.Consulte http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
fonte
se alguém não conseguir resolver o problema com a resposta aceita, observe as considerações abaixo:
localhost:<port>
com<img> src
atributo.context docBase
entrada por si próprio dentro de seuserver.xml
arquivo local .fonte
Leia o InputStream de um arquivo e grave-o
ServletOutputStream
para enviar dados binários para o cliente.Resultar o URL diretamente para o participante
src
.fonte
Se você deseja trabalhar com JAX-RS (por exemplo, RESTEasy), tente o seguinte:
usando
javax.ws.rs.core.Response
ecom.google.common.io.ByteStreams
fonte
Fiz isso ainda mais simples. Problema: Um arquivo CSS tinha links de URL para a pasta img. Obtém 404.
Eu olhei para o URL, http: // tomcatfolder: port / img / blablah.png , que não existe. Mas isso está realmente apontando para o aplicativo ROOT no Tomcat.
Então, eu apenas copiei a pasta img do meu aplicativo da web no aplicativo ROOT. Trabalho!
Não é recomendado para produção, é claro, mas é para um aplicativo de desenvolvimento de ferramentas interno.
fonte