@Controller
@RequestMapping("/upload")
public class FileUploadController {
@Autowired
DocumentoAdjuntoService documentoAdjuntoService;
@Autowired
ParametroValorService parametroValorService;
@PostMapping("/changefile")
public @ResponseBody Message fileUpload(MultipartHttpServletRequest request)
throws IOException {
String url = System.getProperty("user.home");
Util _util = new Util();
List<ParametroValor> lstResult = parametroValorService.list(Constantes.Parametros.URL);
for (ParametroValor oItem : lstResult) {
url += File.separator + oItem.getValor() +File.separator;
}
Message msj = _util.sendFileServer(request,url);
return msj;
}
@RequestMapping(value = "/savefile", method = RequestMethod.POST)
public @ResponseBody Message sendFileUpload(@RequestBody DocumentoAdjunto item)
{
Message msj = documentoAdjuntoService.set(item);
return msj;
}
}
En esta clase observamos que existen dos funciones, el primero fileUpload que es invocado cuando se carga por primera vez el documento desde el cliente y la otra función sendFileUpload cuando se el cliente confirma guardar el documento.
La linea de codigo System.getProperty("user.home") obtiene una ruta base del servidor de aplicaciones donde se va almacenar el documento de forma temporal. La función sendFileServer se detalla a continuación:
public Message sendFileServer(MultipartHttpServletRequest request, String urlServidor) throws IOException{
Message msj = new Message();
File f = new File(urlServidor);
if(!f.exists()){
f.mkdirs();
}
DocumentoAdjunto obj = new DocumentoAdjunto();
Iterator<String> itr = request.getFileNames();
MultipartFile mpf = null;
while(itr.hasNext()){
mpf = request.getFile(itr.next());
String nameFile = new SimpleDateFormat("ddMMyyHHmmss").format(new Date());
nameFile = nameFile + mpf.getOriginalFilename().replace(" ", "-");
obj.setURLDOC(urlServidor+ "-"+nameFile);
try{
FileCopyUtils.copy(mpf.getBytes(), new FileOutputStream(urlServidor+ nameFile));
obj.setNOMDOC(nameFile);
msj.setSuccess(true);
msj.setData(obj);
msj.convert(Constantes.Mensajes.MensajeFileUploadExito);
}
catch(Exception ex){
msj.setSuccess(false);
msj.setData(obj);
msj.setException(ex.getMessage());
msj.setType(Constantes.Mensajes.typeError);
msj.convert(Constantes.Mensajes.MensajeErrorExcepcion);
}
}
return msj;
}
Dicha función copia el documento del cliente al la ruta base que recibe como parámetro "urlServidor", asimismo se almacena con un nombre generado (parámetro nameFile) con el formato de ddMMyyHHmmss y nombre del archivo.
En la clase tambien observamos la funcion sendFileUpload, evento que se activa cuando el cliente decide guardar el documento en la base de datos. Por lo tanto, en el repositorio DocumentoAdjuntoDataImplement.java debe tener la siguiente estructura:
En la clase tambien observamos la funcion sendFileUpload, evento que se activa cuando el cliente decide guardar el documento en la base de datos. Por lo tanto, en el repositorio DocumentoAdjuntoDataImplement.java debe tener la siguiente estructura:
@Repository("documentoAdjuntoData")
public class DocumentoAdjuntoDataImplement implements DocumentoAdjuntoData {
private SimpleJdbcCall insertarDocumentoAdjuntoBrechaIndicador;
@Autowired
public void setDataSource(DataSource dataSource) {
this.insertarDocumentoAdjuntoBrechaIndicador = new SimpleJdbcCall(dataSource)
.withSchemaName(Constantes.BDContext.Schema)
.withCatalogName(Constantes.BDContext.PKG_ADMINISTRACION)
.withProcedureName("USP_INS_DOCUMENTADJUNTO");
}
@Override
public Integer set(DocumentoAdjunto item) {
String oCodigo = "";
SqlParameterSource in = new MapSqlParameterSource()
.addValue("V_URLDOC", item.getURLDOC())
.addValue("V_NOMDOC", item.getNOMDOC())
.addValue("B_BYTEDOC", new SqlLobValue(new ByteArrayInputStream(item.getByteDOC()),
item.getByteDOC().length, new DefaultLobHandler()), Types.BLOB)
.addValue("V_USUCREACIO", item.getUsucreacio());
Map map = insertarDocumentoAdjuntoBrechaIndicador.execute(in);
List<Map> result = (List<Map>) map.get("CV");
for (Map obj : result) {
oCodigo = Format.toString(obj.get("MSG"));
}
return Integer.parseInt(oCodigo);
}
}