Problema Web Service
Que tal, tengo dudas al pasar un Archivo empleando un Web Service
Tengo la siguiente clase:
public final class UploadFile {
@WebMethod()
@WebResult(name ="detalleArchivo")
public DetalleArchivo cargaArchivo(@WebParam(name = "archivo") String nombreOrigen){
File origenFile = new File(nombreOrigen);
String destinoPATH = "C:\\temp\\"+origenFile.getName();
File destino = new File(destinoPATH);
byte[] datos;
try {
datos = readBytes(origenFile);
writeFile(datos, destino);
} catch (IOException e) {
e.printStackTrace();
}
DetalleArchivo da = new DetalleArchivo();
da.setoArchivo(origenFile.getName());
da.setoSize(origenFile.length());
da.setoPATH(origenFile.getAbsolutePath());
da.setdArchivo(destino.getName());
da.setdSize(destino.length());
da.setdPATH(destino.getAbsolutePath());
return da;
}
private static byte[] readBytes(InputStream inputStream) throws IOException {
byte[] archivoByte = new byte[inputStream.available()];
inputStream.read(archivoByte);
inputStream.close();
return archivoByte;
}
private static byte[] readBytes(File fileToRead) throws IOException {
return readBytes(new FileInputStream(fileToRead));
}
private static void writeFile(byte[] content, File fileToWrite)
throws IOException {
FileOutputStream fos = new FileOutputStream(fileToWrite);
ByteBuffer buffer = ByteBuffer.wrap(content);
FileChannel outChannel = fos.getChannel();
outChannel.write(buffer);
fos.close();
System.out.println("Contenido del Buffer escrito en Archivo.");
}
}
Genero el WSDL, y el cliente que haga uso de este WSDL. De forma local hace la copia del archivo.
Pero cuando hago la prueba desde otro equipo muestra el siguiente error
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at imss.factura.UploadFile.readBytes(UploadFile.java:65)
at imss.factura.UploadFile.cargaArchivo(UploadFile.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Agradecería su apoyo para resolver mi duda
- Inicie sesión o regístrese para enviar comentarios
MMM?
Me parece que si lo implementas así, solo funcionaria en local porque siempre buscara la ruta dentro de tu servidor ... en vez de obtener el archivo de la maquina del cliente.
Se me ocurre que en vez de enviar el nombre de nombreOrigen, envies la cadena base64 de tu archivo y después lo vuelvas a construir esa seria una solución, al final creo que estarás enviando solo XML no?
pfff
Por supuesto que no va a funcionar eso. No estás transmitiendo un archivo, sino una cadena. Si el cliente manda la ruta absoluta a un archivo en SU equipo, no puedes esperar que ese mismo archivo exista en el servidor.
Para mandar archivos la opción sería que el parámetro sea un arreglo de bytes, no una cadena (puedes tener un parámetro adicional que sea una cadena para indicar el nombre del archivo, sólo el nombre, no la ruta completa, para que el servidor pueda guardar los bytes como un archivo en su filesystem, o en una base de datos o donde sea, conservando el nombre del mismo).
Efectivamente
Coinsido con ezamudio seria lo más optimo usar un arreglo de byte.