style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Problema Web Service

Que tal, tengo dudas al pasar un Archivo empleando un Web Service

Tengo la siguiente clase:

@WebService()
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

java.io.FileNotFoundException: C:\B\webXXX.xml (El sistema no puede hallar la ruta especificada)
        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

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Fonseca

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?

Imagen de ezamudio

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).

Imagen de Fonseca

Efectivamente

Coinsido con ezamudio seria lo más optimo usar un arreglo de byte.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">