Como acessar um arquivo do contexto da aplicação?

1 resposta
cloudx

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:


1 Resposta

julianoeustaquio

Espero ter ajudado.

getClass().getResource("/").toString()
Criado 16 de janeiro de 2009
Ultima resposta 16 de jan. de 2009
Respostas 1
Participantes 2