quinta-feira, 3 de novembro de 2022

Pegando um arquivo de uma URL com Java usando Proxy

      As vezes nem tudo é tão simples. No artigo anterior eu mostrei como pegar um arquivo com Java a partir de uma URL, porém na maioria das empresas para se ter acesso a internet é preciso usar um proxy devido a configurações de segurança e tal. Então para acessar arquivos de URLs sem usar proxy provavelmente só vai rolar se for de URLs internas da empresa. Mas calma, usar o proxy muda pouca coisa no nosso código e vou seguir com os mesmos exemplos. Como no artigo anterior isso pode ser aplicado a um PDF, uma imagem, etc. Vou mostrar uma forma apenas com Java puro e outra que usa o org.apache.commons.io.IOUtils para copiar do InputStream para o OutputStream.

      No problema em questão a necessidade original era buscar um arquivo e retorná-lo em memória para um método que irá guardá-lo no banco de dados.

       Segue o exemplo de código apenas com o Java puro:

try {
    URL url = new URL("http://www.pdf995.com/samples/pdf.pdf");
    
    //cria o proxy com ip e porta do proxy
    URLConnection openConnection = url.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("ip_do_proxy", 8080)));
    
    // muda a chamado do stream
    InputStream in = new BufferedInputStream(openConnection.getInputStream());
    ByteArrayOutputStream out = new ByteArrayOutputStream();
   
    byte[] buf = new byte[121072]; //quantidade de bytes lida por vez
    int i = 0;
   
    while (-1 != (i = in.read(buf))){
         out.write(buf, 0, i);
    }
   
    out.close();
    in.close();
   
    byte[] dadosRecebidos = out.toByteArray();
           
    File pdf = File.createTempFile("nomedoc"".pdf"); //cria arquivo temporário
    FileOutputStream fos = new FileOutputStream(pdf); // passa o arquivo para o fos
    fos.write(dadosRecebidos); //escreve os dados no arquivo criado
    fos.close();
                 
    return pdf;
                 
           
catch (Exception e) {
    e.printStackTrace();
}

       Segue o exemplo usando o apache commons:

try {
    URL url = new URL("http://www.pdf995.com/samples/pdf.pdf");

    //cria o proxy com ip e porta do proxy
   URLConnection openConnection = url.openConnection(new Proxy(Proxy.Type.HTTPnew InetSocketAddress("ip_do_proxy", 8080)));

    InputStream in = new BufferedInputStream(
openConnection.getInputStream());
   
    File pdf = File.createTempFile("nomedoc"".pdf"); //cria arquivo temporário
    FileOutputStream fos = new FileOutputStream(pdf); // passa o arquivo para o fos
       
    IOUtils.copy(in, fos); // usando org.apache.commons.io.IOUtils para passar os dados para o arquivo
   
    in.close();
    fos.close();
    return pdf;
 
catch (Exception e) {
    e.printStackTrace();
}

       Para este artigo é isso. Se quiser saber como fazer sem o proxy está aqui o artigo:

Pegando um arquivo de uma URL com Java

Pegando um arquivo de uma URL com Java

     Nesse artigo vou mostrar como ler um arquivo de uma URL. Isso pode ser aplicado a um PDF, uma imagem, etc. Vou mostrar uma forma apenas com Java puro e outra que usa o org.apache.commons.io.IOUtils para copiar do InputStream para o OutputStream.

      No problema em questão a necessidade original era buscar um arquivo e retorná-lo em memória para um método que irá guardá-lo no banco de dados.

       Segue o exemplo de código apenas com o Java puro:

try {
    URL url = new URL("http://www.pdf995.com/samples/pdf.pdf");
    InputStream in = new BufferedInputStream(url.openStream());
    ByteArrayOutputStream out = new ByteArrayOutputStream();
   
    byte[] buf = new byte[121072]; //quantidade de bytes lida por vez
    int i = 0;
   
    while (-1 != (i = in.read(buf))){
         out.write(buf, 0, i);
    }
   
    out.close();
    in.close();
   
    byte[] dadosRecebidos = out.toByteArray();
           
    File pdf = File.createTempFile("nomedoc", ".pdf"); //cria arquivo temporário
    FileOutputStream fos = new FileOutputStream(pdf); // passa o arquivo para o fos
    fos.write(dadosRecebidos); //escreve os dados no arquivo criado
    fos.close();
                 
    return pdf;
                 
           
} catch (Exception e) {
    e.printStackTrace();
}

       Segue o exemplo usando o apache commons:

try {
    URL url = new URL("http://www.pdf995.com/samples/pdf.pdf");
    InputStream in = new BufferedInputStream(url.openStream());
   
    File pdf = File.createTempFile("nomedoc", ".pdf"); //cria arquivo temporário
    FileOutputStream fos = new FileOutputStream(pdf); // passa o arquivo para o fos
       
    IOUtils.copy(in, fos); // usando org.apache.commons.io.IOUtils para passar os dados para o arquivo
   
    in.close();
    fos.close();
    return pdf;
 
} catch (Exception e) {
    e.printStackTrace();
}

       Para este artigo é isso.