I have a page with a list of attached files that when clicked should open in a new browser tab. But when clicking on the file a new tab is opened and Error 404 appears. The file is being saved in a folder and only your reference is saved in the database. Some parts of the code have been hidden so as not to overwrite the character limit.
View
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:jsp="http://java.sun.com/JSP/Page"
template="template.xhtml">
<ui:define name="content">
// PARTES OMITIDAS
<h:form>
<p:panel id="panelTermoDeAbertura">
<f:facet name="header">
<h:outputText value="#{livroOrdemController.livroOrdem.dataCriacao}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<h:outputText value=" - TERMO DE ABERTURA DO LIVRO DE ORDEM"/>
</f:facet>
<h:panelGrid columns="2" cellpadding="10">
<h:outputLabel value="Numero da ART: "/>
<h:outputText
value="#{livroOrdemController.art.numeroArt}"/>
<h:outputLabel value="Nome do Proprietário: "/>
<h:outputText
value="#{livroOrdemController.art.nomeProprietario}"/>
<h:outputLabel value="Endereço da Obra: "/>
<h:outputText
value="#{livroOrdemController.art.enderecoObraServico.tipoLogradouro} #{livroOrdemController.art.enderecoObraServico.logradouro},
Nº #{livroOrdemController.art.enderecoObraServico.numero},
CEP: #{livroOrdemController.art.enderecoObraServico.cep},
#{livroOrdemController.art.enderecoObraServico.bairro},
#{livroOrdemController.art.enderecoObraServico.cidade} - #{livroOrdemController.art.enderecoObraServico.uf}"/>
<h:outputLabel value="Data Real do Início da Obra: "/>
<h:outputText
value="#{livroOrdemController.livroOrdem.dataRealInicioObra}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<p:commandButton value="Adicionar Relato"
onclick="dialogRelato.show();"
icon="inserir"/>
<p:commandButton value="Imprimir Livro de Ordem"
icon="impressao"/>
</h:panelGrid>
</p:panel>
<br />
<p:dialog id="dialogRelato"
showEffect="fade" hideEffect="fade"
modal="true" header="Novo Relato"
widgetVar="dialogRelato" minHeight="40"
resizable="false">
<p:messages id="menssagens" autoUpdate="true" closable="true" />
<b>
<h:outputLabel value="Tipo de Relato: " />
</b>
<h:selectOneMenu style="height: 20px; background-color: #ffffff;"
value="#{livroOrdemController.tipoRelatoSelecionado}"
title="Tipo de Relato"
converter="tipoRelatoConverter">
<f:selectItems value="#{livroOrdemController.preencherComboTiposRelatos()}"/>
</h:selectOneMenu>
<br />
<br />
<b>
<h:outputLabel for="calendarDataOcorrencia" value="Data da Ocorrencia: " />
</b>
<p:calendar id="calendarDataOcorrencia"
pattern="dd/MM/yyyy"
locale="pt_BR"
showOn="button"
value="#{livroOrdemController.dataOcorrencia}">
<p:ajax event="dateSelect" listener="#{livroOrdemController.onDataOcorrenciaSelect()}"/>
</p:calendar>
<br />
<br />
<b>
<h:outputLabel value="Fase da Obra/Serviço: " />
</b>
<h:selectOneMenu style="height: 20px; background-color: #ffffff;"
value="#{livroOrdemController.faseObraServicoSelecionada}"
title="Fase da Obra/Serviço"
converter="faseObraServicoConverter">
<f:selectItems value="#{livroOrdemController.preencherComboFaseObraServico()}"/>
</h:selectOneMenu>
<br />
<br />
<b>
<h:outputLabel for="calendarInicioFase" value="Inicio da Fase: " />
</b>
<p:calendar id="calendarInicioFase"
pattern="dd/MM/yyyy"
locale="pt_BR"
showOn="button"
value="#{livroOrdemController.dataIncioFase}">
<p:ajax event="dateSelect" listener="#{livroOrdemController.onDataInicioFaseSelect()}"/>
</p:calendar>
<br />
<br />
<b>
<h:outputLabel for="calendarFimFase" value="Términio da Fase: " />
</b>
<p:calendar id="calendarFimFase"
pattern="dd/MM/yyyy"
showOn="button"
value="#{livroOrdemController.dataTerminioFase}">
<p:ajax event="dateSelect" listener="#{livroOrdemController.onDataTerminioFaseSelect()}"/>
</p:calendar>
<br />
<br />
<b>
<h:outputLabel for="inputDescricaoRelato" value="Descrição: " />
</b>
<br />
<h:inputTextarea id="inputDescricaoRelato"
value="#{livroOrdemController.descricao}"
cols="40"
rows="5"/>
<br />
<br />
<p:commandButton value="Adicionar Relato"
action="#{livroOrdemController.adicionarRelato()}"
process="@this,dialogRelato"
onsuccess="dialogRelato.hide(); dialogAnexoRelato.show();"/>
<p:commandButton value="Cancelar"
onclick="dialogRelato.hide();" />
</p:dialog>
<p:dialog id="dialogAnexoRelato"
resizable="false"
showEffect="fade" hideEffect="fade"
modal="true" header="Novo Relato"
widgetVar="dialogAnexoRelato" minHeight="70">
<p:fileUpload fileUploadListener="#{livroOrdemController.handleFileUploadRelato}"
allowTypes="/(\.|\/)(gif|png|jpe?g|pdf)$/"
sizeLimit="10000000"
label="Anexar Arquivos"
multiple="true"
mode="advanced"
auto="true"
showButtons="false"
process="@this"
dragDropSupport="true"/>
<ui:repeat var="arquivo" value="#{livroOrdemController.arquivosRelatos}">
<p:column>
<p:commandButton actionListener="#{livroOrdemController.excluirArquivo(arquivo)}"
icon="excluir" update="#{livroOrdemController.componentes}" />
<h:outputText value="#{arquivo.nomeArquivo}"/>
</p:column>
</ui:repeat>
<p:commandButton value="Enviar Anexos"
oncomplete="dialogAnexoRelato.hide();"
process="@this,dialogRelato"/>
<p:commandButton value="Cancelar"
onclick="dialogAnexoRelato.hide();" />
</p:dialog>
<ui:repeat var="itemRelato" value="#{livroOrdemController.relatos}">
<p:panel id="panelRelato">
<f:facet name="header">
<h:outputText value="#{itemRelato.dataOcorrencia}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<h:outputText value=" - #{itemRelato.tipoRelato.descricao}"/>
</f:facet>
<h:outputLabel value="Fase da Obra: "/>
<h:outputText value="#{itemRelato.faseObraServico.descricao}"/>
<br />
<h:outputLabel value="Inicio da Fase: "/>
<h:outputText value="#{itemRelato.dataIncioFase}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<br />
<h:outputLabel value="Términio da Fase: "/>
<h:outputText value="#{itemRelato.dataTerminioFase}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<br />
<h:outputLabel value="Descrição: "/><br />
<h:outputText value="#{itemRelato.descricao}"/>
<br />
<b>
<h:outputLabel value="Retificações/Complementos: "/>
</b>
<ui:repeat var="itemRetificacao" value="#{livroOrdemController.recuperarRetificacoes(itemRelato.idRelato)}"
varStatus="statusRetificacao">
<li>
<h:outputText value="#{itemRetificacao.descricao}"/>
<ui:repeat var="itemAnexoRetificacao"
value="#{livroOrdemController.recuperarAnexosRetificacoes(itemRetificacao.idRetificacaoRelato)}">
<li style="padding-left:20px">
<a href="#{itemAnexoRetificacao.caminhoVerArquivo}" target="_blank">
<h:outputText value="#{itemAnexoRetificacao.nomeArquivo}"/>
</a>
</li>
</ui:repeat>
</li>
</ui:repeat>
<br />
<p:commandButton value="Retificar Relato"
onclick="dialogRetificacao.show();">
<f:setPropertyActionListener value="#{itemRelato}" target="#{livroOrdemController.relatoASerRetificado}"/>
</p:commandButton>
<br />
<br />
<ui:repeat var="itemAnexoRelato"
value="#{livroOrdemController.recuperarAnexosRelatos(itemRelato.idRelato)}">
<li>
<h:outputText value="#{itemAnexoRelato.nomeArquivo}"/>
</li>
</ui:repeat>
</p:panel>
<br />
</ui:repeat>
<p:panel rendered="#{livroOrdemController.livroOrdem.encerrado}">
<f:facet name="header">
<h:outputText value="LIVRO DE ORDEM ENCERRADO"/>
</f:facet>
</p:panel>
<p:dialog id="dialogRetificacao" showEffect="fade" hideEffect="fade"
modal="true" header="Retificar/Complementar um Relato"
widgetVar="dialogRetificacao" minHeight="40">
<b>
<h:outputLabel value="Tipo de Relato: " />
</b>
<h:outputText id="tipoRelato" value="#{livroOrdemController.relatoASerRetificado.tipoRelato.descricao}"/>
<br />
<b>
<h:outputLabel value="Data da Ocorrência: " />
</b>
<h:outputText id="dataOcorrencia" value="#{livroOrdemController.relatoASerRetificado.dataOcorrencia}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<br />
<b>
<h:outputLabel value="Fase da Obra/Serviço: " />
</b>
<h:outputText id="faseObraServico" value="#{livroOrdemController.relatoASerRetificado.faseObraServico.descricao}"/>
<br />
<b>
<h:outputLabel value="Inicio da Fase: " />
</b>
<h:outputText id="inicioFase" value="#{livroOrdemController.relatoASerRetificado.dataIncioFase}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<br />
<b>
<h:outputLabel value="Términio da Fase: " />
</b>
<h:outputText id="terminioFase" value="#{livroOrdemController.relatoASerRetificado.dataTerminioFase}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
<br />
<b>
<h:outputLabel value="Descrição: " />
</b>
<br />
<h:inputTextarea id="descricaoRetificacao"
value="#{livroOrdemController.descricaoRetificacao}"
cols="40" rows="5"/>
<br />
<p:commandButton value="Retificar/Complementar Relato"
process="@this,dialogRetificacao"
onsuccess="dialogRetificacao.hide();dialogAnexoRetificacao.show();"
action="#{livroOrdemController.retificarRelato()}"
update="@([id$=panelRelato])"/>
<p:commandButton value="Cancelar"
onclick="dialogRetificacao.hide();" />
</p:dialog>
<p:dialog id="dialogAnexoRetificacao"
resizable="false"
showEffect="fade" hideEffect="fade"
modal="true" header="Novo Relato"
widgetVar="dialogAnexoRetificacao" minHeight="70">
<b>
<h:outputLabel value="Anexo de Arquivos: "/>
</b>
<p:fileUpload fileUploadListener="#{livroOrdemController.handleFileUploadRetificacao}"
allowTypes="/(\.|\/)(gif|png|jpe?g|pdf)$/"
sizeLimit="10000000"
label="Anexar Arquivos"
multiple="true"
mode="advanced"
auto="true"
showButtons="false"
process="@this"
dragDropSupport="true"/>
<p:commandButton value="Enviar Anexos"
oncomplete="dialogAnexoRetificacao.hide();"
process="@this,dialogAnexoRetificacao"
action="#{livroOrdemController.retificarRelato()}"
update="@([id$=panelRelato])"/>
<p:commandButton value="Cancelar"
onclick="dialogAnexoRetificacao.hide();" />
</p:dialog>
</h:form>
</ui:define>
Controller
@ManagedBean
@ViewScoped
public class LivroOrdemController {
// ALGUMAS VARIÁVEIS OCULTADAS
private RetificacaoRelato retificacaoRelato;
private Relato relatoASerRetificado;
private List<Relato> relatos = new ArrayList<Relato>();
private UploadedFile uploadedFile;
private ArquivoRelato arquivoRelato;
private List<ArquivoRelato> arquivosRelatos = new ArrayList<ArquivoRelato>();
private boolean anexoRequired;
public LivroOrdemController() {
}
@PostConstruct
public void inicializar() {
relato = new Relato();
retificacaoRelato = new RetificacaoRelato();
}
public void recuperarNumeroArt(ValueChangeEvent valueChangeEvent) {
numeroArt = valueChangeEvent.getNewValue().toString();
recuperarLivroOrdem();
recuperarRelatos();
recuperarArt();
encerrarLivroOrdem();
}
public void recuperarArt() {
art = artDao.pesquisarPorId(numeroArt);
}
// PARTE OCULTADA
public SelectItem[] preencherComboTiposRelatos() {
SelectItem[] options = null;
String query = "SELECT tr FROM TipoRelato tr";
List<TipoRelato> tipoRelatos = tipoRelatoDao.listPesq(query);
if (tipoRelatos != null && tipoRelatos.size() > 0) {
int i = 0;
options = new SelectItem[tipoRelatos.size() + 1];
options[i++] = new SelectItem(null, "Selecione...");
for (TipoRelato tr : tipoRelatos) {
options[i++] = new SelectItem(tr, tr.getDescricao());
}
}
return options;
}
public SelectItem[] preencherComboFaseObraServico() {
SelectItem[] options = null;
String query = "SELECT fos FROM FaseObraServico fos";
List<FaseObraServico> faseObraServicos = faseObraServicoDao.listPesq(query);
if (faseObraServicos != null && faseObraServicos.size() > 0) {
int i = 0;
options = new SelectItem[faseObraServicos.size() + 1];
options[i++] = new SelectItem(null, "Selecione...");
for (FaseObraServico fo : faseObraServicos) {
options[i++] = new SelectItem(fo, fo.getDescricao());
}
}
return options;
}
public void recuperarRelatos() {
Map<String, Object> params = new HashMap<String, Object>();
String queryRelato = "SELECT r.idRelato, r.dataOcorrencia, r.dataIncioFase, r.dataTerminioFase, r.descricao AS descricaoRelato, "
+ "tr.descricao AS tiporelato, fos.descricao AS faseobraservico "
+ "FROM Relato r "
+ "LEFT JOIN TipoRelato tr ON tr.idTipoRelato = r.tiporelato_idtiporelato "
+ "LEFT JOIN FaseObraServico fos ON fos.idFaseObraServico = r.faseobraservico_idfaseobraservico "
+ "WHERE r.livroordem_idlivroordem = :idlivroordem ORDER BY dataocorrencia DESC";
params.put("idlivroordem", livroOrdem.getIdLivroOrdem());
List<Object[]> objects = objectDao.listPesqQuery(queryRelato, params);
for (Object[] o : objects) {
Relato relatoTemp = new Relato();
BigInteger id = (BigInteger) o[0];
relatoTemp.setIdRelato(id.longValue());
relatoTemp.setDataOcorrencia((Date) o[1]);
relatoTemp.setDataIncioFase((Date) o[2]);
relatoTemp.setDataTerminioFase((Date) o[3]);
relatoTemp.setDescricao((String) o[4]);
relatoTemp.setTipoRelato(new TipoRelato());
relatoTemp.getTipoRelato().setDescricao((String) o[5]);
relatoTemp.setFaseObraServico(new FaseObraServico());
relatoTemp.getFaseObraServico().setDescricao((String) o[6]);
relatos.add(relatoTemp);
}
}
public List<RetificacaoRelato> recuperarRetificacoes(Long idRelato) {
List<RetificacaoRelato> retificacoes = new ArrayList<RetificacaoRelato>();
Map<String, Object> params = new HashMap<String, Object>();
String queryRetificacoes = "SELECT rr.idRetificacaoRelato, rr.descricao FROM RetificacaoRelato rr "
+ "WHERE rr.relato_idrelato = :idrelato";
params.put("idrelato", idRelato);
List<Object[]> objects = objectDao.listPesqQuery(queryRetificacoes, params);
for (Object[] o : objects) {
RetificacaoRelato retificacaoRelatoTemp = new RetificacaoRelato();
BigInteger id = (BigInteger) o[0];
retificacaoRelatoTemp.setIdRetificacaoRelato(id.longValue());
retificacaoRelatoTemp.setDescricao((String) o[1]);
retificacoes.add(retificacaoRelatoTemp);
}
return retificacoes;
}
public List<ArquivoRelato> recuperarAnexosRetificacoes(Long idRetificacao) {
List<ArquivoRelato> arquivosRetificacao = new ArrayList<ArquivoRelato>();
Map<String, Object> params = new HashMap<String, Object>();
String queryArquivoRetificacoes = "SELECT aret.caminhoverarquivo FROM ArquivoRelato aret "
+ "WHERE aret.retificacaorelato_idretificacaorelato = :idRetificacao";
params.put("idRetificacao", idRetificacao);
List<Object> objects = objectDao.listPesqQueryUmParametro(queryArquivoRetificacoes, params);
for(Object o : objects) {
ArquivoRelato arquivoRelatoTemp = new ArquivoRelato();
arquivoRelatoTemp.setCaminhoVerArquivo((String) o);
arquivoRelatoTemp.setNomeArquivo(arquivoRelatoTemp.getCaminhoVerArquivo());
arquivosRetificacao.add(arquivoRelatoTemp);
}
return arquivosRetificacao;
}
public List<ArquivoRelato> recuperarAnexosRelatos(Long idRelato) {
List<ArquivoRelato> arquivosRelato = new ArrayList<ArquivoRelato>();
Map<String, Object> params = new HashMap<String, Object>();
String queryArquivoRetificacoes = "SELECT arel.caminhoverarquivo FROM ArquivoRelato arel "
+ "WHERE arel.relato_idrelato = :idRelato";
params.put("idRelato", idRelato);
List<Object> objects = objectDao.listPesqQueryUmParametro(queryArquivoRetificacoes, params);
for(Object o : objects) {
ArquivoRelato arquivoRelatoTemp = new ArquivoRelato();
arquivoRelatoTemp.setCaminhoVerArquivo((String) o);
arquivoRelatoTemp.setNomeArquivo(arquivoRelatoTemp.getCaminhoVerArquivo());
arquivosRelato.add(arquivoRelatoTemp);
}
return arquivosRelato;
}
public void handleFileUploadRelato(FileUploadEvent event) throws IOException {
UploadedFile item = event.getFile();
Calendar c = Calendar.getInstance();
int mes = c.get(Calendar.MONTH);
mes++;
String complementoDir = c.get(Calendar.YEAR) + "/" + mes + "/" +
c.get(Calendar.DAY_OF_MONTH) + "/";
String sDiretorio =
SistemaConstante.CAMINHO_ARQUIVOS_LIVRO_ORDEM + complementoDir;
String sCaminho =
SistemaConstante.DIRETORIO_ARQUIVOS_LIVRO_ORDEM + complementoDir;
String nomeArquivo = item.getFileName().replace("\", File.separator);
File diretorio = new File(sDiretorio);
boolean diretorioCriado = true;
if (!diretorio.exists()) {
if (!diretorio.mkdir()) {
if (!diretorio.mkdirs()) {
FacesUtils.mensFatal("Falha na criação do diretório!");
diretorioCriado = false;
}
}
}
if(diretorioCriado) {
String aux = removerAcentos(nomeArquivo);
String caminhoArquivo = sDiretorio + aux;
String caminhoVerArquivo = sCaminho + aux;
File arquivo = new File(caminhoArquivo);
OutputStream out = new FileOutputStream(arquivo);
out.write(item.getContents());
out.close();
ArquivoRelato arqRelato = new ArquivoRelato();
arqRelato.setCaminhoArquivo(caminhoArquivo);
arqRelato.setCaminhoVerArquivo(caminhoVerArquivo);
arqRelato.setRelato(relato);
arquivoRelatoDao.salvar(arqRelato);
arquivosRelatos.add(arqRelato);
FacesUtils.mensInfo("Arquivo(s) enviado(s) com sucesso!");
}
}
public void handleFileUploadRetificacao(FileUploadEvent event) throws IOException {
UploadedFile item = event.getFile();
Calendar c = Calendar.getInstance();
int mes = c.get(Calendar.MONTH);
mes++;
String complementoDir = c.get(Calendar.YEAR) + "/" + mes + "/" + c.get(Calendar.DAY_OF_MONTH) + "/";
String sDiretorio = SistemaConstante.CAMINHO_ARQUIVOS_LIVRO_ORDEM + complementoDir;
String sCaminho = SistemaConstante.DIRETORIO_ARQUIVOS_LIVRO_ORDEM + complementoDir;
String nomeArquivo = item.getFileName().replace("\", File.separator);
File diretorio = new File(sDiretorio);
boolean diretorioCriado = true;
if (!diretorio.exists()) {
if (!diretorio.mkdir()) {
if (!diretorio.mkdirs()) {
FacesUtils.mensFatal("Falha na criação do diretório!");
diretorioCriado = false;
}
}
}
if(diretorioCriado) {
String aux = removerAcentos(nomeArquivo);
String caminhoArquivo = sDiretorio + aux;
String caminhoVerArquivo = sCaminho + aux;
File arquivo = new File(caminhoArquivo);
OutputStream out = new FileOutputStream(arquivo);
out.write(item.getContents());
out.close();
ArquivoRelato arqRelato = new ArquivoRelato();
arqRelato.setCaminhoArquivo(caminhoArquivo);
arqRelato.setCaminhoVerArquivo(caminhoVerArquivo);
arqRelato.setRetificacaoRelato(retificacaoRelato);
arquivoRelatoDao.salvar(arqRelato);
arquivosRelatos.add(arqRelato);
FacesUtils.mensInfo("Arquivo(s) enviado(s) com sucesso!");
}
}
}