FileUpload archivos mediante JAX-RS
Last updated
Last updated
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
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
git clone https://github.com/avbravo/serverfiles.git
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>
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
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