Ola galera, minha situação é a sequinte:
eu tenho a classe MyBean que faz o download de um arquivo, no caso um pdf.
o meu problema está no método getFilePath() que retorna o caminho até o arquivo,
se eu colocar do jeito que está abaixo ele encontra o arquivo direitinho.
só que eu tenho que colocar o caminho completo desde a raiz do sistema!
como eu faço para que ele encontre o arquivo do contexto da própria aplicação?
package mypackage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
public class MyBean {
// Constants ----------------------------------------------------------------------------------
private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
// Actions ------------------------------------------------------------------------------------
public void downloadPDF() throws IOException {
// Prepare.
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
File file = new File(getFilePath(), getFileName());
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
// Open file.
input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
// Init servlet response.
response.reset();
response.setContentType("application/pdf");
response.setContentLength(input.available());
response.setHeader("Content-disposition", "inline; filename=\"" + getFileName() + "\"");
output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
// Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
for (int length; (length = input.read(buffer)) != -1;) {
output.write(buffer, 0, length);
}
// Finalize task.
output.flush();
} finally {
// Gently close streams.
close(output);
close(input);
}
// Inform JSF that it doesn't need to handle response.
// This is very important, otherwise you will get the following exception in the logs:
// java.lang.IllegalStateException: Cannot forward after response has been committed.
facesContext.responseComplete();
}
// Helpers (can be refactored to public utility class) ----------------------------------------
private String getFileName() {
return "sistrans.pdf";
}
private String getFilePath() {
return "/home/marcos/workspace/PDFHandling/WEB-INF/classes/mypackage/resourses";
}
private static void close(Closeable resource) {
if (resource != null) {
try {
resource.close();
} catch (IOException e) {
// Do your thing with the exception. Print it, log it or mail it.
e.printStackTrace();
}
}
}
}
e esta é a estrutura de diretórios da minha aplicação:

