2009-08-22 23 views
14

Estoy buscando una forma fácil de obtener archivos que se encuentran en un servidor remoto. Para ello he creado un servidor FTP local en mi Windows XP, y ahora estoy tratando de dar mi examen de applet de la siguiente dirección:Lectura de un archivo remoto con Java

try 
{ 
    uri = new URI("ftp://localhost/myTest/test.mid"); 
    File midiFile = new File(uri); 
} 
catch (Exception ex) 
{ 
} 

y por supuesto recibo el siguiente error:

URI scheme is not "file"

He estado intentando otras formas de obtener el archivo, parece que no funcionan. ¿Cómo debería hacerlo? (También estoy dispuesto a realizar una solicitud HTTP)

Respuesta

19

No se puede hacer esto de fábrica con ftp.

Si el archivo se encuentra en http, se podría hacer algo similar a:

URL url = new URL("http://q.com/test.mid"); 
InputStream is = url.openStream(); 
// Read from is 

Si desea utilizar una biblioteca para hacer FTP, que debe salir Apache Commons Net

8

lectura de archivos binarios a través de HTTP y guardarlo en un archivo local (tomado de here):

URL u = new URL("http://www.java2s.com/binary.dat"); 
URLConnection uc = u.openConnection(); 
String contentType = uc.getContentType(); 
int contentLength = uc.getContentLength(); 
if (contentType.startsWith("text/") || contentLength == -1) { 
    throw new IOException("This is not a binary file."); 
} 
InputStream raw = uc.getInputStream(); 
InputStream in = new BufferedInputStream(raw); 
byte[] data = new byte[contentLength]; 
int bytesRead = 0; 
int offset = 0; 
while (offset < contentLength) { 
    bytesRead = in.read(data, offset, data.length - offset); 
    if (bytesRead == -1) 
    break; 
    offset += bytesRead; 
} 
in.close(); 

if (offset != contentLength) { 
    throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes"); 
} 

String filename = u.getFile().substring(filename.lastIndexOf('/') + 1); 
FileOutputStream out = new FileOutputStream(filename); 
out.write(data); 
out.flush(); 
out.close(); 
4

Usted está casi allí. Necesita usar URL, en lugar de URI. Java viene con controlador de URL predeterminado para FTP. Por ejemplo, se puede leer el archivo remoto en el conjunto de bytes de este tipo,

try { 
     URL url = new URL("ftp://localhost/myTest/test.mid"); 
     InputStream is = url.openStream(); 
     ByteArrayOutputStream os = new ByteArrayOutputStream();   
     byte[] buf = new byte[4096]; 
     int n;   
     while ((n = is.read(buf)) >= 0) 
      os.write(buf, 0, n); 
     os.close(); 
     is.close();   
     byte[] data = os.toByteArray(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Sin embargo, FTP no puede ser el mejor protocolo para usar en un applet. Además de las restricciones de seguridad, tendrá que lidiar con problemas de conectividad ya que FTP requiere múltiples puertos. Use HTTP si todo es posible según lo sugerido por otros.

-5

Dado que está en Windows, puede configurar una red compartida y acceder a ella de esa manera.

0

Esto funcionó para mí, al intentar llevar el archivo de una máquina remota a mi máquina.

NOTA - Estos son los parámetros pasados ​​a la función mencionada en el código de abajo:

String domain = "xyz.company.com"; 
String userName = "GDD"; 
String password = "fjsdfks"; 

(aquí se tiene que dar su dirección IP de la máquina del sistema remoto, entonces la ruta del archivo de texto (testFileUpload.txt) en la máquina remota, aquí C$ significa la unidad C del sistema remoto. también la dirección IP comienza con \\, pero con el fin de escapar de las dos barras invertidas que empezamos \\\\)

String remoteFilePathTransfer = "\\\\13.3.2.33\\c$\\FileUploadVerify\\testFileUpload.txt"; 

(h antes de esto es el camino en la máquina local a la que el archivo tiene que ser transferido, se creará este nuevo archivo de texto - testFileUploadTransferred.txt, con el contenido en el archivo remoto - testFileUpload.txt que está en el sistema remoto)

String fileTransferDestinationTransfer = "D:/FileUploadVerification/TransferredFromRemote/testFileUploadTransferred.txt"; 

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.vfs.FileObject; 
import org.apache.commons.vfs.FileSystemException; 
import org.apache.commons.vfs.FileSystemManager; 
import org.apache.commons.vfs.FileSystemOptions; 
import org.apache.commons.vfs.Selectors; 
import org.apache.commons.vfs.UserAuthenticator; 
import org.apache.commons.vfs.VFS; 
import org.apache.commons.vfs.auth.StaticUserAuthenticator; 
import org.apache.commons.vfs.impl.DefaultFileSystemConfigBuilder; 

public class FileTransferUtility { 

    public void transferFileFromRemote(String domain, String userName, String password, String remoteFileLocation, 
      String fileDestinationLocation) { 

     File f = new File(fileDestinationLocation); 
     FileObject destn; 
     try { 
      FileSystemManager fm = VFS.getManager(); 

      destn = VFS.getManager().resolveFile(f.getAbsolutePath()); 

      if(!f.exists()) 
      { 
       System.out.println("File : "+fileDestinationLocation +" does not exist. transferring file from : "+ remoteFileLocation+" to: "+fileDestinationLocation); 
      } 
      else 
       System.out.println("File : "+fileDestinationLocation +" exists. Transferring(override) file from : "+ remoteFileLocation+" to: "+fileDestinationLocation); 

      UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password); 
      FileSystemOptions opts = new FileSystemOptions(); 
      DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth); 
      FileObject fo = VFS.getManager().resolveFile(remoteFileLocation, opts); 
      System.out.println(fo.exists()); 
      destn.copyFrom(fo, Selectors.SELECT_SELF); 
      destn.close(); 
      if(f.exists()) 
      { 
       System.out.println("File transfer from : "+ remoteFileLocation+" to: "+fileDestinationLocation+" is successful"); 
      } 
     } 

     catch (FileSystemException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
0

He codificado un Java Remote File objetos cliente/servidor para acceder a un sistema de archivos remoto como si fuera local. Funciona sin ninguna autenticación (que era el punto en ese momento) pero podría modificarse para usar SSLSocket en lugar de los sockets estándar para la autenticación.

Es muy acceso en bruto: sin nombre de usuario/contraseña, no hay directorio "home"/chroot.

Todo se mantiene tan simple como sea posible:

configuración del servidor

JRFServer srv = JRFServer.get(new InetSocketAddress(2205)); 
srv.start(); 

configuración de cliente

JRFClient cli = new JRFClient(new InetSocketAddress("jrfserver-hostname", 2205)); 

Usted tiene acceso a distancia File, InputStream y OutputStream a través de la cliente. Extiende java.io.File para un uso sin interrupciones en API usando File para acceder a sus metadatos (es decir, length(), lastModified(), ...).

También utiliza compresión opcional para transferencia de fragmentos de archivos y MTU programable, con recuperación optimizada de todo el archivo. Una CLI está incorporada con una sintaxis similar a FTP para usuarios finales.

Cuestiones relacionadas