FileUpload archivos mediante JAX-RS

Muchas veces necesitamos enviar un archivo mediante JAX-RS a un servidor.

En el ejemplo a continuación enviaremos automáticamente tres archivos cifrados al servidor.

Para cifrar archivos lea la siguiente guia.

Jmoordbutils implementa JAX-RS para el envió de archivos.

Tambien podemos incluir parametros en el header

En el ejemplo que definimos usamos dos aplicaciones Web:

  • serverfiles : Que se ejecuta en el servidor y recibe los archivos

  • sendwebfiles : Es el cliente que envía los archivos al servidor.

Podemos ver el ejemplo de la ejecución.

Utilizamos la clase Microservices.java de jmoordbutils para enviar archivos.

Microservices.sendFileWithJaxRs(directory, "license.enc", "http://localhost:8080/serverfiles/resources/file", "upload");

Pasar parametros en el header

  Response response  =Microservices.sendFileWithJaxRsHeaders(directory, "license.enc", "http://localhost:8080/serverfiles/resources/file", "upload"
                  ,"folder","license");

Deseamos enviar archivos desde la carpeta /fiscalprinter/license en nuestra maquina local

al directorio /fiscalserver/license en el servidor

Proyecto serverfiles: servidor recibe el archivo

git clone https://github.com/avbravo/serverfiles.git

Proyecto sendwebfile envia archivo al servidor

git clone https://github.com/avbravo/sendwebfile.git

Fuente

Clonamos el proyecto serverfiles con PayaraMicro que implemente JAX-RS para recibir archivos.

pom.xml

 <dependencies>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.2.7</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>7.0</version>
        </dependency>
      
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>${jakartaee}</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.19</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        
        
          <dependency>
            <groupId>com.github.avbravo</groupId>
            <artifactId>jmoordbutils</artifactId>
            <version>0.69</version>
        </dependency>
    </dependencies>

Crear la clase FileServices.java

Cree una carpeta para almacenar los archivos recibidos en el ejemplo /fiscalprinter/license.

También descifra el archivo cifrado.

 public String desencriptarFile(){
        try{
            String fileEnc = directory+JsfUtil.fileSeparator()+"license.enc"; 
     
            String fileIvEnc= directory+JsfUtil.fileSeparator()+"licenseiv.enc";
            String fileDes= directory+JsfUtil.fileSeparator()+"license.des";
            
          
            String keyDesCifrado=JsfUtil.desencriptar("Cwn31aDWCb1u4OKjX5QEsLyCCXxtw8enAhKbLM/raCU=");
           String extension="json";
            System.out.println("voy a descifrar ");
            if(FileDecryption.desencriptarFile(fileEnc, fileIvEnc,fileDes, keyDesCifrado, extension)){
               JsfUtil.successMessage("Se desencripto archivo");
                       System.out.println("Se desencripto archivo");
            }else{
                JsfUtil.warningMessage("No se desencripto el archivo");
                  System.out.println("No se desencripto el archivo");
            }
         
          } catch (Exception e) {
            JsfUtil.errorDialog("desencriptarFile()", e.getLocalizedMessage());
               System.out.println("desencriptarFile()"+ e.getLocalizedMessage());
        }
        return "";
    }

Recibe el archivo enviado desde el cliente y también si tiene parametros adicionales se manejasn.

import com.avbravo.jmoordbutils.JsfUtil;
import com.avbravo.jmoordbutils.fileencripter.FileDecryption;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

/**
 *
 * @author avbravo
 */
@Path("/file")
public class FileService {

    private String directory = JsfUtil.userHome() + JsfUtil.fileSeparator() + "fiscalserver" + JsfUtil.fileSeparator() + "license";

    @POST
    @Path("/upload")
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    @Produces(MediaType.TEXT_PLAIN)
    public Response reciveFile(@Context HttpHeaders headers, InputStream fileInputStream) {
        MultivaluedMap<String, String> map = headers.getRequestHeaders();
 
        //getFileName
        String fileName = getFileName(map);

        //get folder
        String folder = getFolder(map);

        
        OutputStream out = null;

        File directorio = new File(directory);
        if (!directorio.exists()) {
            //Crear el directorio
            if (directorio.mkdirs()) {
              System.out.println("---> creado el directorio");
//
          } else {
                System.out.println("---> no se creo el directorio");
            }
        }

        String filePath = directory + JsfUtil.fileSeparator() + fileName;
        try {
            out = new FileOutputStream(new File(filePath));
            byte[] buf = new byte[1024];
            int len;
            while ((len = fileInputStream.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            
            //Desencripta el archivo
           
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
         if(fileName.equals("license.des")){
                desencriptarFile();
            }
             
        return Response.status(Response.Status.OK).entity("File '" + filePath + "' uploaded successfully")
                .type(MediaType.TEXT_PLAIN).build();
    }

    private String getFileName(MultivaluedMap<String, String> headers) {
        try {
           String[] contentDisposition = headers.getFirst("Content-Disposition").split(";");
        for (String filename : contentDisposition) {
            if ((filename.trim().startsWith("filename"))) {
                String[] name = filename.split("=");
                String finalFileName = name[1].trim().replaceAll("\"", "");
                return finalFileName;
            }
        }  
        } catch (Exception e) {
            System.out.println("getFileName() "+e.getLocalizedMessage());
        }
       
        return "";
    }
    
    private String getFolder(MultivaluedMap<String, String> headers) {
        try {
             String[] folder = headers.getFirst("folder").split(";");
        for (String filename : folder) {
            if ((filename.trim().startsWith("folder"))) {
                String[] name = filename.split("=");
                String finalFileName = name[1].trim().replaceAll("\"", "");
                return finalFileName;
            }
        }
        } catch (Exception e) {
            System.out.println(" getFolder() "+e.getLocalizedMessage());
        }
       
        return "";
    }
    
    
    // <editor-fold defaultstate="collapsed" desc="desencriptarFile()">
     public String desencriptarFile(){
        try{
            String fileEnc = directory+JsfUtil.fileSeparator()+"license.enc"; 
     
            String fileIvEnc= directory+JsfUtil.fileSeparator()+"licenseiv.enc";
            String fileDes= directory+JsfUtil.fileSeparator()+"license.des";
            
                   System.out.println("fileEnc "+fileEnc);
                   System.out.println("fileIVEnc "+fileIvEnc);
                   System.out.println("fileDes "+fileDes);
            String keyDesCifrado=JsfUtil.desencriptar("Cwn31aDWCb1u4OKjX5QEsLyCCXxtw8enAhKbLM/raCU=");
           String extension="json";
            System.out.println("voy a descifrar ");
            if(FileDecryption.desencriptarFile(fileEnc, fileIvEnc,fileDes, keyDesCifrado, extension)){
               JsfUtil.successMessage("Se desencripto archivo");
                       System.out.println("Se desencripto archivo");
            }else{
                JsfUtil.warningMessage("No se desencripto el archivo");
                  System.out.println("No se desencripto el archivo");
            }
         
          } catch (Exception e) {
            JsfUtil.errorDialog("desencriptarFile()", e.getLocalizedMessage());
               System.out.println("desencriptarFile()"+ e.getLocalizedMessage());
        }
        return "";
    }
// </editor-fold>
}

Crear la clase JAX-RS CONFIGURATION

import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

/**
 * Configures JAX-RS for the application.
 * @author Juneau
 */
@ApplicationPath("resources")
public class JAXRSConfiguration extends Application {
      @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        resources.add(com.bpbonline.serverfiles.resources.JavaEE8Resource.class);
        resources.add(com.bpbonline.serverfiles.resources.FileService.class);
       
        
       
        return resources;
    }
}

Ejecutar el proyecto

Clonar proyecto sendwebfile

Desde este proyecto enviaremos el archivo al servidor.

Dependencias pom.xml


    <dependencies>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.2.7</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>7.0</version>
        </dependency>
    
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>${jakartaee}</version>
            <scope>provided</scope>
        </dependency>
        
          <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.25.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.25</version>
        </dependency>
<dependency>
            <groupId>com.github.avbravo</groupId>
            <artifactId>jmoordbutils</artifactId>
            <version>0.70</version>
        </dependency>

      
    </dependencies>

Cree la clase FileController.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bpbonline.sendweb;

import com.avbravo.jmoordbutils.JsfUtil;
import com.avbravo.jmoordbutils.jaxrs.Microservices;
import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import javax.ws.rs.core.Response;

/**
 *
 * @author avbravo
 */
@Named
@ViewScoped
public class FileController implements Serializable {

    private String directory = JsfUtil.userHome() + JsfUtil.fileSeparator() + "fiscalprinter" + JsfUtil.fileSeparator() + "license" + JsfUtil.fileSeparator();

    public String send() {

        try {
            //--Files to send 
          Response response  =Microservices.sendFileWithJaxRsHeaders(directory, "license.enc", "http://localhost:8080/serverfiles/resources/file", "upload"
                  ,"folder","license");
        Response responseivEnc =  Microservices.sendFileWithJaxRsHeaders(directory, "licenseiv.enc", "http://localhost:8080/serverfiles/resources/file", "upload"
                ,"folder","license");
       Response responseDes   =  Microservices.sendFileWithJaxRsHeaders(directory, "license.des", "http://localhost:8080/serverfiles/resources/file", "upload"
              ,"folder" ,"license");
               
           String mensajeExistoso="";
           String mensajeFallido="";
            if (response.getStatus() == 200 && responseivEnc.getStatus() == 200 &&  responseDes.getStatus() == 200)  {
              JsfUtil.infoDialog("Envio existoso"," Se enviaron exitosamente los archivos: licemse.emc, licenseiv.enc, license.des");
            } else{
                         if (response.getStatus() == 200){
                             mensajeExistoso+=" license.enc";
                         }else{
                             mensajeFallido=" license.enc";
                         }
                         if (responseivEnc.getStatus() == 200){
                             mensajeExistoso+=" licenseiv.enc";
                         }else{
                             mensajeFallido+=" licenseiv.enc";
                         }
                         
                         if (responseDes.getStatus() == 200){
                             mensajeExistoso+=" license.des";
                         }else{
                             mensajeFallido+=" license.desc";
                         }
                        JsfUtil.infoDialog("Proceso terminado","Exitosos:"+mensajeExistoso +  "    Fallidps: "+mensajeFallido);     
                         
            }
    

        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.errorDialog("send)=", e.getLocalizedMessage());
        }
        return "";
    }
 
}

Cree la pagina index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="form" prependId="false">
            <h1><p:outputLabel value="Sendwebfile"/></h1>
            <p:outputLabel value="Envia un archivo desde el controller al microservices"/>
            <br></br>
            <p:outputLabel value="Pasos:"/>
           <br></br>
            <p:outputLabel value="1.Ejecute serverfiles.jar primero"/>
            
            
              <p:growl id="growl"></p:growl>
            <p:panelGrid columns="2">
                
                <p:outputLabel value="Nota"/>
                    
                <p:outputLabel value="Copie los archivos en /fiscalprinter/license"/>
                <p:outputLabel value="Archivos"/>
                <p:outputLabel value="license.enc, licenseiv.enc, license.desc"/>
                
          
                        
            
            </p:panelGrid>
          
        <p:commandButton value="Send File"
                             action="#{fileController.send()}"
                             update=":form"
                             />
            
        </h:form>
    </h:body>
</html>

Una pagina simple que enviara directamente un archivo al server

Last updated